Files
GostGenerator/view/documentsettingsdialog.cpp
T

1680 lines
82 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "documentsettingsdialog.h"
#include "../controller/maincontroller.h"
#include "../controller/perechentablecontroller.h"
#include "../controller/specificationpcbcontroller.h"
#include "../controller/specificationcontroller.h"
#include "../controller/vedomostcontroller.h"
#include "../model/componenttablemodel.h"
#include <QDebug>
#include <QMessageBox>
#include <QApplication>
#include <QDir>
#include <QFile>
#include <QPixmap>
#include <QTransform>
#include <QPainter>
#include <QFont>
// Инициализация статических данных о графах ГОСТ
QMap<int, QString> DocumentSettingsDialog::s_fieldNames;
QMap<int, QString> DocumentSettingsDialog::s_fieldDescriptions;
void DocumentSettingsDialog::initializeFieldData()
{
if (s_fieldNames.isEmpty()) {
// Основные поля (обязательные)
s_fieldNames[1] = "Наименование изделия";
s_fieldNames[2] = "Обозначение документа";
s_fieldNames[4] = "Литера";
s_fieldNames[9] = "Наименование организации";
s_fieldNames[10] = "Характер работы (Разраб.)";
s_fieldNames[11] = "Фамилии лиц";
s_fieldNames[111] = "Фамилия разработчика";
s_fieldNames[112] = "Фамилия проверяющего";
s_fieldNames[113] = "Фамилия Норм контроллера";
s_fieldNames[114] = "Фамилия утверждающего";
// Поля изменений (обязательные)
s_fieldNames[14] = "Сведения об изменениях";
s_fieldNames[15] = "Сведения об изменениях (Лист)";
s_fieldNames[16] = "Сведения об изменениях (№ докум.)";
s_fieldNames[19] = "Инвентарный номер подлинника";
// Поля изменений (специфичные для каждого документа)
s_fieldNames[21] = "Взамен инв. номер";
s_fieldNames[22] = "Инв. номер дубликата";
s_fieldNames[24] = "Обозначение документа (взамен) / Справ. №";
s_fieldNames[25] = "Обозначение соответствующего документа / Перв. примен.";
s_fieldNames[301]= "Наименование документа";
s_fieldNames[1002] = "Название документа";
// Описания полей
s_fieldDescriptions[1] = "(1) Центральная область титульного листа";
s_fieldDescriptions[2] = "(2) Центральная область + последующие страницы";
s_fieldDescriptions[4] = "(4) Правый верхний угол";
s_fieldDescriptions[9] = "(9) Правый нижний угол";
s_fieldDescriptions[10] = "(10) Указывается характер работы";
s_fieldDescriptions[11] = "(11) Общая группа для фамилий";
s_fieldDescriptions[111] = "Фамилия разработчика документа";
s_fieldDescriptions[112] = "Фамилия проверяющего документа";
s_fieldDescriptions[113] = "Фамилия нормоконтролера";
s_fieldDescriptions[114] = "Фамилия утверждающего лица";
s_fieldDescriptions[14] = "(14) Информация об изменениях в документе";
s_fieldDescriptions[15] = "(15) Номер листа с изменениями";
s_fieldDescriptions[16] = "(16) Номер документа с изменениями";
s_fieldDescriptions[19] = "(19) Инвентарный номер подлинника документа";
s_fieldDescriptions[21] = "(21) Инвентарный номер заменяемого документа";
s_fieldDescriptions[22] = "(22) Инвентарный номер дубликата";
s_fieldDescriptions[24] = "(24) Обозначение заменяемого документа или справочный номер";
s_fieldDescriptions[25] = "(25) Обозначение соответствующего документа или первое применение";
s_fieldDescriptions[301] = "(1 низ)Наименование документа под обозначением документа";
}
}
DocumentSettingsDialog::DocumentSettingsDialog(DocumentType docType, MainController *controller, QWidget *parent)
: QDialog(parent)
, m_documentType(docType)
, m_controller(controller)
, m_projectParamModel(nullptr)
, m_titleInscriptionsModel(nullptr)
{
qDebug() << "DocumentSettingsDialog: Конструктор для типа документа:" << static_cast<int>(docType);
// Инициализируем статические данные
initializeFieldData();
// Получаем модели из контроллера
if (m_controller) {
m_projectParamModel = m_controller->projectParamTableModel();
m_titleInscriptionsModel = m_controller->titleInscriptionsModel();
// Получаем доступные свойства компонентов
if (m_controller->componentTableModel()) {
m_availableProperties = m_controller->componentTableModel()->propertyNames();
}
}
setUp();
}
void DocumentSettingsDialog::setUp()
{
qDebug() << "DocumentSettingsDialog::setUp: Начинаем настройку диалога";
setWidgets();
createTabWidget();
setUpLayout();
setUpConnections();
loadTableSettings();
loadInscriptionSettings();
loadFontSettings();
// Загружаем настройки децимальных номеров (только для SpecificationPCB и Specification)
if (m_documentType == DocumentType::SpecificationPCB || m_documentType == DocumentType::Specification) {
loadDecimalNumberSettings();
}
// Загружаем настройки "Куда входит" для ведомости
if (m_documentType == DocumentType::Vedomost) {
loadDecimalNumberSettings();
}
qDebug() << "DocumentSettingsDialog::setUp: Настройка диалога завершена";
}
void DocumentSettingsDialog::setWidgets()
{
qDebug() << "DocumentSettingsDialog::setWidgets: Создаем виджеты";
// Создаем кнопки диалога
m_okButton = new QPushButton("ОК", this);
m_cancelButton = new QPushButton("Отмена", this);
qDebug() << "DocumentSettingsDialog::setWidgets: Виджеты созданы";
}
void DocumentSettingsDialog::createTabWidget()
{
qDebug() << "DocumentSettingsDialog::createTabWidget: Создаем табы";
m_tabWidget = new QTabWidget(this);
// Создаем табы
createTableSettingsTab();
createTitleInscriptionsTab();
// Добавляем табы в виджет
m_tabWidget->addTab(m_tableSettingsTab, "Настройки таблицы");
m_tabWidget->addTab(m_titleInscriptionsTab, "Основные надписи");
qDebug() << "DocumentSettingsDialog::createTabWidget: Табы созданы";
}
void DocumentSettingsDialog::createTableSettingsTab()
{
qDebug() << "DocumentSettingsDialog::createTableSettingsTab: Создаем таб настроек таблицы";
m_tableSettingsTab = new QWidget();
m_tableScrollArea = new QScrollArea(m_tableSettingsTab);
m_tableScrollContent = new QWidget();
m_resetTableButton = new QPushButton("Сбросить настройки", m_tableSettingsTab);
// Создаем поля для настроек колонок
createTableColumnFields();
// Создаем поля для децимальных номеров (только для SpecificationPCB и Specification)
if (m_documentType == DocumentType::SpecificationPCB || m_documentType == DocumentType::Specification) {
createDecimalNumberFields();
}
// Создаем поле "Куда входит" для ведомости
if (m_documentType == DocumentType::Vedomost) {
createWhereUsedField();
}
// Создаем поля для размера шрифта и поджима
createFontSettingsFields();
// Настраиваем компоновку
QVBoxLayout *tabLayout = new QVBoxLayout(m_tableSettingsTab);
// Добавляем описание
QLabel *descriptionLabel = new QLabel("Настройте соответствие колонок таблицы свойствам компонентов:", m_tableSettingsTab);
tabLayout->addWidget(descriptionLabel);
// Добавляем область прокрутки
m_tableScrollArea->setWidget(m_tableScrollContent);
m_tableScrollArea->setWidgetResizable(true);
tabLayout->addWidget(m_tableScrollArea);
// Добавляем кнопку сброса
QHBoxLayout *buttonLayout = new QHBoxLayout();
buttonLayout->addStretch();
buttonLayout->addWidget(m_resetTableButton);
tabLayout->addLayout(buttonLayout);
qDebug() << "DocumentSettingsDialog::createTableSettingsTab: Таб настроек таблицы создан";
}
void DocumentSettingsDialog::createTitleInscriptionsTab()
{
qDebug() << "DocumentSettingsDialog::createTitleInscriptionsTab: Создаем таб основных надписей";
m_titleInscriptionsTab = new QWidget();
m_inscriptionScrollArea = new QScrollArea(m_titleInscriptionsTab);
m_inscriptionScrollContent = new QWidget();
m_resetInscriptionButton = new QPushButton("Сбросить настройки", m_titleInscriptionsTab);
// Создаем поля для надписей
createInscriptionFields();
// Создаем предварительный просмотр
createImagePreview();
// Настраиваем компоновку
QHBoxLayout *tabLayout = new QHBoxLayout(m_titleInscriptionsTab);
// Левая панель с настройками
QVBoxLayout *leftPanel = new QVBoxLayout();
// Добавляем описание
QLabel *descriptionLabel = new QLabel("Настройте основные надписи документа:", m_titleInscriptionsTab);
leftPanel->addWidget(descriptionLabel);
// Добавляем область прокрутки
m_inscriptionScrollArea->setWidget(m_inscriptionScrollContent);
m_inscriptionScrollArea->setWidgetResizable(true);
leftPanel->addWidget(m_inscriptionScrollArea);
// Добавляем кнопку сброса
QHBoxLayout *buttonLayout = new QHBoxLayout();
buttonLayout->addStretch();
buttonLayout->addWidget(m_resetInscriptionButton);
leftPanel->addLayout(buttonLayout);
// Правая панель с предварительным просмотром
QVBoxLayout *rightPanel = new QVBoxLayout();
QLabel *previewLabel = new QLabel("Предварительный просмотр:", m_titleInscriptionsTab);
rightPanel->addWidget(previewLabel);
rightPanel->addWidget(m_imageView);
// Добавляем слайдер масштабирования
QHBoxLayout *zoomLayout = new QHBoxLayout();
zoomLayout->addWidget(new QLabel("Масштаб:", m_titleInscriptionsTab));
zoomLayout->addWidget(m_zoomSlider);
rightPanel->addLayout(zoomLayout);
// Добавляем панели в основную компоновку
tabLayout->addLayout(leftPanel, 2);
tabLayout->addLayout(rightPanel, 1);
qDebug() << "DocumentSettingsDialog::createTitleInscriptionsTab: Таб основных надписей создан";
}
void DocumentSettingsDialog::setUpLayout()
{
qDebug() << "DocumentSettingsDialog::setUpLayout: Настраиваем компоновку";
QVBoxLayout *mainLayout = new QVBoxLayout(this);
// Добавляем табы
mainLayout->addWidget(m_tabWidget);
// Добавляем кнопки диалога
QHBoxLayout *buttonLayout = new QHBoxLayout();
buttonLayout->addStretch();
buttonLayout->addWidget(m_okButton);
buttonLayout->addWidget(m_cancelButton);
mainLayout->addLayout(buttonLayout);
// Устанавливаем размер диалога
resize(800, 600);
qDebug() << "DocumentSettingsDialog::setUpLayout: Компоновка настроена";
}
void DocumentSettingsDialog::setUpConnections()
{
qDebug() << "DocumentSettingsDialog::setUpConnections: Настраиваем соединения";
connect(m_okButton, &QPushButton::clicked, this, &DocumentSettingsDialog::onAccept);
connect(m_cancelButton, &QPushButton::clicked, this, &DocumentSettingsDialog::onCancel);
connect(m_resetTableButton, &QPushButton::clicked, this, &DocumentSettingsDialog::onResetTableSettings);
connect(m_resetInscriptionButton, &QPushButton::clicked, this, &DocumentSettingsDialog::onResetInscriptionSettings);
connect(m_zoomSlider, &QSlider::valueChanged, this, &DocumentSettingsDialog::onZoomChanged);
qDebug() << "DocumentSettingsDialog::setUpConnections: Соединения настроены";
}
void DocumentSettingsDialog::createTableColumnFields()
{
qDebug() << "DocumentSettingsDialog::createTableColumnFields: Создаем поля настроек таблицы";
QStringList columnNames = getTableColumnNames();
QStringList defaultMappings = getDefaultTableMappings();
QGridLayout *gridLayout = new QGridLayout(m_tableScrollContent);
gridLayout->setAlignment(Qt::AlignTop);
// Заголовки
if(columnNames.size()>0){
gridLayout->addWidget(new QLabel("Колонка", m_tableScrollContent), 0, 0);
gridLayout->addWidget(new QLabel("Свойство компонента", m_tableScrollContent), 0, 1);
}
// Создаем комбобоксы для каждой колонки
for (int i = 0; i < columnNames.size(); ++i) {
QLabel *columnLabel = new QLabel(columnNames[i], m_tableScrollContent);
gridLayout->addWidget(columnLabel, i + 1, 0);
QComboBox *comboBox = new QComboBox(m_tableScrollContent);
comboBox->addItem("-- Не выбрано --", "");
// Добавляем доступные свойства
for (const QString &property : m_availableProperties) {
// Для свойств компонентов показываем только название, так как значения могут быть разными для каждого компонента
comboBox->addItem(property, property);
}
// По умолчанию устанавливаем "Не выбрано"
comboBox->setCurrentIndex(0);
// Соединяем сигнал изменения
connect(comboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
[this, i](const QString &value) {
onTableComboBoxChanged(i, value);
});
m_tableColumnComboBoxes.append(comboBox);
gridLayout->addWidget(comboBox, i + 1, 1);
}
qDebug() << "DocumentSettingsDialog::createTableColumnFields: Поля настроек таблицы созданы";
}
void DocumentSettingsDialog::createDecimalNumberFields()
{
qDebug() << "DocumentSettingsDialog::createDecimalNumberFields: Создаем поля децимальных номеров и названия платы";
// Создаем группу для децимальных номеров и названия платы
QGroupBox *decimalGroup = new QGroupBox("Децимальные номера и название платы", m_tableScrollContent);
QGridLayout *decimalLayout = new QGridLayout(decimalGroup);
int currentRow = 0;
// Поле "Название платы" (только для SpecificationPCB)
if (m_documentType == DocumentType::SpecificationPCB) {
QLabel *boardNameLabel = new QLabel("Название платы:", decimalGroup);
decimalLayout->addWidget(boardNameLabel, currentRow, 0);
QComboBox *boardNameComboBox = new QComboBox(decimalGroup);
boardNameComboBox->setEditable(true);
boardNameComboBox->addItem("-- Не выбрано --", "");
// Добавляем параметры проекта
if (m_projectParamModel) {
QMap<QString, QString> projectParams = m_projectParamModel->getDataAsMap();
for (auto it = projectParams.begin(); it != projectParams.end(); ++it) {
QString paramName = it.key();
QString paramValue = it.value();
// Формируем отображаемый текст: "Название (значение)" если значение не пустое
QString displayText = paramName;
if (!paramValue.isEmpty()) {
displayText += QString(" (%1)").arg(paramValue);
}
boardNameComboBox->addItem(displayText, paramName);
}
}
// Соединяем сигнал изменения
connect(boardNameComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
[this](const QString &value) {
onDecimalNumberComboBoxChanged("boardName", value);
});
// Добавляем комбобокс в компоновку
decimalLayout->addWidget(boardNameComboBox, currentRow, 1);
// Сохраняем ссылку на комбобокс
m_decimalNumberComboBoxes["boardName"] = boardNameComboBox;
currentRow++;
}
// Поле "Название документа" (только для Specification)
if (m_documentType == DocumentType::Specification) {
QLabel *documentNameLabel = new QLabel("Название документа:", decimalGroup);
decimalLayout->addWidget(documentNameLabel, currentRow, 0);
QComboBox *documentNameComboBox = new QComboBox(decimalGroup);
documentNameComboBox->setEditable(true);
documentNameComboBox->addItem("-- Не выбрано --", "");
// Добавляем параметры проекта
if (m_projectParamModel) {
QMap<QString, QString> projectParams = m_projectParamModel->getDataAsMap();
for (auto it = projectParams.begin(); it != projectParams.end(); ++it) {
QString paramName = it.key();
QString paramValue = it.value();
// Формируем отображаемый текст: "Название (значение)" если значение не пустое
QString displayText = paramName;
if (!paramValue.isEmpty()) {
displayText += QString(" (%1)").arg(paramValue);
}
documentNameComboBox->addItem(displayText, paramName);
}
}
// Соединяем сигнал изменения
connect(documentNameComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
[this](const QString &value) {
onDecimalNumberComboBoxChanged("documentName", value);
});
// Добавляем комбобокс в компоновку
decimalLayout->addWidget(documentNameComboBox, currentRow, 1);
// Сохраняем ссылку на комбобокс
m_decimalNumberComboBoxes["documentName"] = documentNameComboBox;
currentRow++;
}
// Поле "Децимальный номер платы"
QLabel *boardLabel = new QLabel("Децимальный номер платы:", decimalGroup);
decimalLayout->addWidget(boardLabel, currentRow, 0);
QComboBox *boardComboBox = new QComboBox(decimalGroup);
boardComboBox->setEditable(true);
boardComboBox->addItem("-- Не выбрано --", "");
// Поле "Децимальный номер документа"
currentRow++;
QLabel *docLabel = new QLabel("Децимальный номер документа:", decimalGroup);
decimalLayout->addWidget(docLabel, currentRow, 0);
QComboBox *docComboBox = new QComboBox(decimalGroup);
docComboBox->setEditable(true);
docComboBox->addItem("-- Не выбрано --", "");
// Добавляем параметры проекта в оба комбобокса
if (m_projectParamModel) {
QMap<QString, QString> projectParams = m_projectParamModel->getDataAsMap();
for (auto it = projectParams.begin(); it != projectParams.end(); ++it) {
QString paramName = it.key();
QString paramValue = it.value();
// Формируем отображаемый текст: "Название (значение)" если значение не пустое
QString displayText = paramName;
if (!paramValue.isEmpty()) {
displayText += QString(" (%1)").arg(paramValue);
}
boardComboBox->addItem(displayText, paramName);
docComboBox->addItem(displayText, paramName);
}
}
// Соединяем сигналы изменения
connect(boardComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
[this](const QString &value) {
onDecimalNumberComboBoxChanged("board", value);
});
connect(docComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
[this](const QString &value) {
onDecimalNumberComboBoxChanged("document", value);
});
// Добавляем комбобоксы в компоновку
// boardComboBox должен быть на той же строке, что и boardLabel (currentRow - 1)
decimalLayout->addWidget(boardComboBox, currentRow - 1, 1);
// docComboBox на текущей строке
decimalLayout->addWidget(docComboBox, currentRow, 1);
// Сохраняем ссылки на комбобоксы
m_decimalNumberComboBoxes["board"] = boardComboBox;
m_decimalNumberComboBoxes["document"] = docComboBox;
// Добавляем группу в основную компоновку таблицы
QGridLayout *mainGridLayout = qobject_cast<QGridLayout*>(m_tableScrollContent->layout());
if (mainGridLayout) {
int row = mainGridLayout->rowCount();
mainGridLayout->addWidget(decimalGroup, row, 0, 1, 2);
} else {
// Если основная компоновка не является QGridLayout, создаем новую
QVBoxLayout *mainLayout = new QVBoxLayout(m_tableScrollContent);
mainLayout->addWidget(decimalGroup);
}
qDebug() << "DocumentSettingsDialog::createDecimalNumberFields: Поля децимальных номеров и названия платы созданы";
}
void DocumentSettingsDialog::createWhereUsedField()
{
qDebug() << "DocumentSettingsDialog::createWhereUsedField: Создаем поле 'Куда входит'";
// Создаем группу для поля "Куда входит"
QGroupBox *whereUsedGroup = new QGroupBox("Куда входит (обозначение)", m_tableScrollContent);
QGridLayout *whereUsedLayout = new QGridLayout(whereUsedGroup);
// Поле "Куда входит"
QLabel *whereUsedLabel = new QLabel("Куда входит (обозначение):", whereUsedGroup);
whereUsedLayout->addWidget(whereUsedLabel, 0, 0);
QComboBox *whereUsedComboBox = new QComboBox(whereUsedGroup);
whereUsedComboBox->setEditable(true);
whereUsedComboBox->addItem("-- Не выбрано --", "");
// Добавляем параметры проекта в комбобокс
if (m_projectParamModel) {
QMap<QString, QString> projectParams = m_projectParamModel->getDataAsMap();
for (auto it = projectParams.begin(); it != projectParams.end(); ++it) {
QString paramName = it.key();
QString paramValue = it.value();
// Формируем отображаемый текст: "Название (значение)" если значение не пустое
QString displayText = paramName;
if (!paramValue.isEmpty()) {
displayText += QString(" (%1)").arg(paramValue);
}
whereUsedComboBox->addItem(displayText, paramName);
}
}
// Соединяем сигнал изменения
connect(whereUsedComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
[this](const QString &value) {
onDecimalNumberComboBoxChanged("whereUsed", value);
});
// Добавляем комбобокс в компоновку
whereUsedLayout->addWidget(whereUsedComboBox, 0, 1);
// Сохраняем ссылку на комбобокс
m_decimalNumberComboBoxes["whereUsed"] = whereUsedComboBox;
// Добавляем группу в основную компоновку таблицы
QGridLayout *mainGridLayout = qobject_cast<QGridLayout*>(m_tableScrollContent->layout());
if (mainGridLayout) {
int row = mainGridLayout->rowCount();
mainGridLayout->addWidget(whereUsedGroup, row, 0, 1, 2);
} else {
// Если основная компоновка не является QGridLayout, создаем новую
QVBoxLayout *mainLayout = new QVBoxLayout(m_tableScrollContent);
mainLayout->addWidget(whereUsedGroup);
}
qDebug() << "DocumentSettingsDialog::createWhereUsedField: Поле 'Куда входит' создано";
}
void DocumentSettingsDialog::createFontSettingsFields()
{
qDebug() << "DocumentSettingsDialog::createFontSettingsFields: Создаем поля настроек шрифта";
// Создаем группу для настроек шрифта
QGroupBox *fontGroup = new QGroupBox("Настройки шрифта таблицы", m_tableScrollContent);
QGridLayout *fontLayout = new QGridLayout(fontGroup);
// Поле "Размер шрифта"
QLabel *fontSizeLabel = new QLabel("Размер шрифта:", fontGroup);
fontLayout->addWidget(fontSizeLabel, 0, 0);
m_fontSizeSpinBox = new QSpinBox(fontGroup);
m_fontSizeSpinBox->setMinimum(6);
m_fontSizeSpinBox->setMaximum(72);
m_fontSizeSpinBox->setValue(12);
m_fontSizeSpinBox->setSuffix(" пт");
fontLayout->addWidget(m_fontSizeSpinBox, 0, 1);
// Поле "Поджим по ширине"
QLabel *fontStretchLabel = new QLabel("Поджим по ширине:", fontGroup);
fontLayout->addWidget(fontStretchLabel, 1, 0);
m_fontStretchSpinBox = new QSpinBox(fontGroup);
m_fontStretchSpinBox->setMinimum(50);
m_fontStretchSpinBox->setMaximum(200);
m_fontStretchSpinBox->setValue(100);
m_fontStretchSpinBox->setSuffix("%");
fontLayout->addWidget(m_fontStretchSpinBox, 1, 1);
// Добавляем группу в основную компоновку таблицы
QGridLayout *mainGridLayout = qobject_cast<QGridLayout*>(m_tableScrollContent->layout());
if (mainGridLayout) {
int row = mainGridLayout->rowCount();
mainGridLayout->addWidget(fontGroup, row, 0, 1, 2);
} else {
// Если основная компоновка не является QGridLayout, создаем новую
QVBoxLayout *mainLayout = qobject_cast<QVBoxLayout*>(m_tableScrollContent->layout());
if (mainLayout) {
mainLayout->addWidget(fontGroup);
}
}
qDebug() << "DocumentSettingsDialog::createFontSettingsFields: Поля настроек шрифта созданы";
}
void DocumentSettingsDialog::createInscriptionFields()
{
qDebug() << "DocumentSettingsDialog::createInscriptionFields: Создаем поля надписей";
QList<int> requiredFields = getRequiredInscriptionFields();
QList<int> optionalFields = getOptionalInscriptionFields();
QVBoxLayout *mainLayout = new QVBoxLayout(m_inscriptionScrollContent);
// Создаем группу для обязательных полей
if (!requiredFields.isEmpty()) {
QGroupBox *requiredGroup = new QGroupBox("Обязательные поля", m_inscriptionScrollContent);
QGridLayout *requiredLayout = new QGridLayout(requiredGroup);
int row = 0;
for (int fieldNumber : requiredFields) {
createInscriptionField(fieldNumber, requiredLayout, row, true);
row++;
}
mainLayout->addWidget(requiredGroup);
}
// Создаем группу для опциональных полей
if (!optionalFields.isEmpty()) {
QGroupBox *optionalGroup = new QGroupBox("Опциональные поля", m_inscriptionScrollContent);
QGridLayout *optionalLayout = new QGridLayout(optionalGroup);
int row = 0;
for (int fieldNumber : optionalFields) {
createInscriptionField(fieldNumber, optionalLayout, row, false);
row++;
}
mainLayout->addWidget(optionalGroup);
}
mainLayout->addStretch();
qDebug() << "DocumentSettingsDialog::createInscriptionFields: Поля надписей созданы";
}
void DocumentSettingsDialog::createInscriptionField(int fieldNumber, QGridLayout *layout, int row, bool isRequired)
{
QString fieldName = s_fieldNames.value(fieldNumber, QString("Поле %1").arg(fieldNumber));
QString fieldDescription = s_fieldDescriptions.value(fieldNumber, "");
// Создаем метку с названием поля
QString labelText = fieldName;
if (isRequired) {
labelText += " *";
}
QLabel *nameLabel = new QLabel(labelText);
nameLabel->setWordWrap(true);
layout->addWidget(nameLabel, row, 0);
// Создаем редактируемый комбобокс для выбора значения
QComboBox *comboBox = new QComboBox();
comboBox->setEditable(true);
comboBox->addItem("-- Не выбрано --", "");
// Добавляем параметры проекта
if (m_projectParamModel) {
QMap<QString, QString> projectParams = m_projectParamModel->getDataAsMap();
for (auto it = projectParams.begin(); it != projectParams.end(); ++it) {
QString paramName = it.key();
QString paramValue = it.value();
// Формируем отображаемый текст: "Название (значение)" если значение не пустое
QString displayText = paramName;
if (!paramValue.isEmpty()) {
displayText += QString(" (%1)").arg(paramValue);
}
comboBox->addItem(displayText, paramName);
}
}
// Соединяем сигнал изменения
connect(comboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
[this, fieldNumber](const QString &value) {
onInscriptionComboBoxChanged(fieldNumber, value);
});
m_inscriptionComboBoxes[fieldNumber] = comboBox;
layout->addWidget(comboBox, row, 1);
// Создаем метку для описания
if (!fieldDescription.isEmpty()) {
QLabel *descLabel = new QLabel(fieldDescription);
descLabel->setWordWrap(true);
descLabel->setStyleSheet("color: gray; font-size: 10px;");
layout->addWidget(descLabel, row, 3);
}
// Сохраняем информацию о поле
TitleInscriptionFieldExtended field;
field.number = fieldNumber;
field.name = fieldName;
field.description = fieldDescription;
field.isRequired = isRequired;
field.isCustom = false;
field.currentValue = "";
field.projectParamName = "";
m_inscriptionFields[fieldNumber] = field;
}
void DocumentSettingsDialog::createImagePreview()
{
qDebug() << "DocumentSettingsDialog::createImagePreview: Создаем предварительный просмотр";
m_imageView = new QGraphicsView();
m_imageScene = new QGraphicsScene();
m_imageView->setScene(m_imageScene);
// Загружаем изображение титульного листа
QStringList possiblePaths;
possiblePaths << QApplication::applicationDirPath() + "/assets/Титул.PNG";
possiblePaths << QApplication::applicationDirPath() + "/assets/Title.PNG";
possiblePaths << "assets/Титул.PNG";
possiblePaths << "assets/Title.PNG";
possiblePaths << ":/assets/Титул.PNG";
possiblePaths << ":/assets/Title.PNG";
QString imagePath;
bool imageFound = false;
for (const QString &path : possiblePaths) {
qDebug() << "DocumentSettingsDialog::createImagePreview: Проверяем путь:" << path;
if (QFile::exists(path)) {
imagePath = path;
imageFound = true;
qDebug() << "DocumentSettingsDialog::createImagePreview: Найдено изображение по пути:" << path;
break;
}
}
if (imageFound) {
QPixmap pixmap(imagePath);
if (!pixmap.isNull()) {
m_imageItem = m_imageScene->addPixmap(pixmap);
m_imageScene->setSceneRect(pixmap.rect());
m_imageView->fitInView(m_imageScene->sceneRect(), Qt::KeepAspectRatio);
qDebug() << "DocumentSettingsDialog::createImagePreview: Изображение загружено успешно, размер:" << pixmap.size();
} else {
qDebug() << "DocumentSettingsDialog::createImagePreview: Не удалось загрузить изображение из" << imagePath;
createPlaceholderImage();
}
} else {
qDebug() << "DocumentSettingsDialog::createImagePreview: Не удалось найти изображение титульного листа";
createPlaceholderImage();
}
// Создаем слайдер масштабирования
m_zoomSlider = new QSlider(Qt::Horizontal);
m_zoomSlider->setRange(25, 200);
m_zoomSlider->setValue(100);
m_zoomSlider->setTickPosition(QSlider::TicksBelow);
m_zoomSlider->setTickInterval(25);
qDebug() << "DocumentSettingsDialog::createImagePreview: Предварительный просмотр создан";
}
void DocumentSettingsDialog::createPlaceholderImage()
{
// Создаем заглушку с текстом
QPixmap placeholder(400, 600);
placeholder.fill(Qt::white);
QPainter painter(&placeholder);
painter.setPen(Qt::black);
painter.setFont(QFont("Arial", 14));
painter.drawText(placeholder.rect(), Qt::AlignCenter, "Титульный лист\n(изображение не найдено)");
m_imageItem = m_imageScene->addPixmap(placeholder);
m_imageScene->setSceneRect(placeholder.rect());
}
QStringList DocumentSettingsDialog::getTableColumnNames() const
{
switch (m_documentType) {
case DocumentType::Perechen:
return {"Наименование"};
case DocumentType::SpecificationPCB:
return {"Обозначение", "Наименование"};
case DocumentType::Specification:
return {}; // Пока ничего не нужно
case DocumentType::Vedomost:
return {"Наименование", "Код продукции", "Обозначение документа на поставку",
"Поставщик", "Примечание"};
default:
return {};
}
}
QStringList DocumentSettingsDialog::getDefaultTableMappings() const
{
switch (m_documentType) {
case DocumentType::Perechen:
// Перечень: только наименование
return {"Name"};
case DocumentType::SpecificationPCB:
// Спецификация ПП: обозначение и наименование
return {"Designator", "Name"};
case DocumentType::Specification:
// Спецификация: пока ничего не нужно
return {};
case DocumentType::Vedomost:
// Ведомость: только поля, которые можно маппить на свойства компонентов
return {"Name", "ProductCode", "DocumentCode", "Supplier", "WhereUsed", "Note"};
default:
return {};
}
}
QList<int> DocumentSettingsDialog::getRequiredInscriptionFields() const
{
// Общие обязательные поля для всех документов
return {1, 2, 4, 9, 10, 11, 111, 112, 113, 114, 25};
}
QList<int> DocumentSettingsDialog::getOptionalInscriptionFields() const
{
// Специфичные поля для каждого типа документа
switch (m_documentType) {
case DocumentType::Perechen:
// Перечень: поля изменений для перечня элементов
return {};
case DocumentType::SpecificationPCB:
// Спецификация ПП: поля изменений для спецификации печатной платы
return {};
case DocumentType::Specification:
// Спецификация материалов: поля изменений для спецификации материалов
// Поле 1002 "Название документа" теперь находится в разделе децимальных номеров
return {};
case DocumentType::Vedomost:
// Ведомость покупных изделий: поля изменений для ведомости
return {301};
default:
return {};
}
}
void DocumentSettingsDialog::loadTableSettings()
{
qDebug() << "DocumentSettingsDialog::loadTableSettings: Загружаем настройки таблицы";
// Загружаем текущие настройки из контроллера
if (m_controller) {
qDebug() << "DocumentSettingsDialog::loadTableSettings: Контроллер доступен";
switch (m_documentType) {
case DocumentType::Perechen:
qDebug() << "DocumentSettingsDialog::loadTableSettings: Загружаем для Perechen";
if (m_controller->perechenTableController()) {
qDebug() << "DocumentSettingsDialog::loadTableSettings: PerechenTableController доступен";
m_currentTableMappings = m_controller->perechenTableController()->getColumnMappings();
qDebug() << "DocumentSettingsDialog::loadTableSettings: Загружены настройки Perechen:" << m_currentTableMappings;
} else {
qDebug() << "DocumentSettingsDialog::loadTableSettings: PerechenTableController недоступен";
}
break;
case DocumentType::SpecificationPCB:
qDebug() << "DocumentSettingsDialog::loadTableSettings: Загружаем для SpecificationPCB";
if (m_controller->specificationPCBController()) {
qDebug() << "DocumentSettingsDialog::loadTableSettings: SpecificationPCBController доступен";
m_currentTableMappings = m_controller->specificationPCBController()->getColumnMappings();
qDebug() << "DocumentSettingsDialog::loadTableSettings: Загружены настройки SpecificationPCB:" << m_currentTableMappings;
} else {
qDebug() << "DocumentSettingsDialog::loadTableSettings: SpecificationPCBController недоступен";
}
break;
case DocumentType::Specification:
qDebug() << "DocumentSettingsDialog::loadTableSettings: Загружаем для Specification";
if (m_controller->specificationController()) {
qDebug() << "DocumentSettingsDialog::loadTableSettings: SpecificationController доступен";
m_currentTableMappings = m_controller->specificationController()->getColumnMappings();
qDebug() << "DocumentSettingsDialog::loadTableSettings: Загружены настройки Specification:" << m_currentTableMappings;
} else {
qDebug() << "DocumentSettingsDialog::loadTableSettings: SpecificationController недоступен";
}
break;
case DocumentType::Vedomost:
qDebug() << "DocumentSettingsDialog::loadTableSettings: Загружаем для Vedomost";
if (m_controller->vedomostController()) {
qDebug() << "DocumentSettingsDialog::loadTableSettings: VedomostController доступен";
m_currentTableMappings = m_controller->vedomostController()->getColumnMappings();
qDebug() << "DocumentSettingsDialog::loadTableSettings: Загружены настройки Vedomost:" << m_currentTableMappings;
} else {
qDebug() << "DocumentSettingsDialog::loadTableSettings: VedomostController недоступен";
}
break;
}
} else {
qDebug() << "DocumentSettingsDialog::loadTableSettings: Контроллер недоступен";
}
qDebug() << "DocumentSettingsDialog::loadTableSettings: Применяем настройки к комбобоксам, количество:" << m_tableColumnComboBoxes.size();
// Применяем настройки к комбобоксам
for (int i = 0; i < m_tableColumnComboBoxes.size() && i < m_currentTableMappings.size(); ++i) {
QString value = m_currentTableMappings[i];
qDebug() << "DocumentSettingsDialog::loadTableSettings: Применяем значение" << value << "к комбобоксу" << i;
if (value.isEmpty()) {
// Если значение пустое, устанавливаем "-- Не выбрано --"
m_tableColumnComboBoxes[i]->setCurrentIndex(0);
} else {
// Сначала ищем по данным (itemData)
int index = m_tableColumnComboBoxes[i]->findData(value);
if (index >= 0) {
m_tableColumnComboBoxes[i]->setCurrentIndex(index);
qDebug() << "DocumentSettingsDialog::loadTableSettings: Установлен индекс" << index << "для значения" << value << "(найдено по данным)";
} else {
// Если не найдено по данным, ищем по тексту
index = m_tableColumnComboBoxes[i]->findText(value);
if (index >= 0) {
m_tableColumnComboBoxes[i]->setCurrentIndex(index);
qDebug() << "DocumentSettingsDialog::loadTableSettings: Установлен индекс" << index << "для значения" << value << "(найдено по тексту)";
} else {
// Если не найдено, добавляем значение в комбобокс и устанавливаем его
m_tableColumnComboBoxes[i]->addItem(value, value);
index = m_tableColumnComboBoxes[i]->findData(value);
m_tableColumnComboBoxes[i]->setCurrentIndex(index);
qDebug() << "DocumentSettingsDialog::loadTableSettings: Добавлено значение" << value << "в комбобокс и установлен индекс" << index;
}
}
}
}
qDebug() << "DocumentSettingsDialog::loadTableSettings: Настройки таблицы загружены";
}
void DocumentSettingsDialog::loadInscriptionSettings()
{
qDebug() << "DocumentSettingsDialog::loadInscriptionSettings: Загружаем настройки надписей";
if (m_titleInscriptionsModel) {
QMap<int, QString> savedValues = m_titleInscriptionsModel->getAllInscriptions();
for (auto it = savedValues.begin(); it != savedValues.end(); ++it) {
int fieldNumber = it.key();
QString value = it.value();
if (m_inscriptionComboBoxes.contains(fieldNumber)) {
// Ищем значение в комбобоксе по данным (название поля)
int index = m_inscriptionComboBoxes[fieldNumber]->findData(value);
if (index >= 0) {
// Нашли предустановленное значение, устанавливаем его
m_inscriptionComboBoxes[fieldNumber]->setCurrentIndex(index);
} else {
// Если значение не найдено в предустановленных, устанавливаем как кастомный текст
m_inscriptionComboBoxes[fieldNumber]->setCurrentText(value);
}
// Обновляем поле (сохраняем оригинальное значение из модели)
m_inscriptionFields[fieldNumber].currentValue = value;
}
}
}
qDebug() << "DocumentSettingsDialog::loadInscriptionSettings: Настройки надписей загружены";
}
void DocumentSettingsDialog::loadFontSettings()
{
qDebug() << "DocumentSettingsDialog::loadFontSettings: Загружаем настройки шрифта";
if (!m_controller || !m_fontSizeSpinBox || !m_fontStretchSpinBox) {
qDebug() << "DocumentSettingsDialog::loadFontSettings: Контроллер или виджеты недоступны";
return;
}
int fontSize = 12;
int fontStretch = 100;
// Получаем настройки из соответствующего контроллера
switch (m_documentType) {
case DocumentType::Perechen:
if (m_controller->perechenTableController()) {
fontSize = m_controller->perechenTableController()->getFontSize();
fontStretch = m_controller->perechenTableController()->getFontStretch();
}
break;
case DocumentType::SpecificationPCB:
if (m_controller->specificationPCBController()) {
fontSize = m_controller->specificationPCBController()->getFontSize();
fontStretch = m_controller->specificationPCBController()->getFontStretch();
}
break;
case DocumentType::Specification:
if (m_controller->specificationController()) {
fontSize = m_controller->specificationController()->getFontSize();
fontStretch = m_controller->specificationController()->getFontStretch();
}
break;
case DocumentType::Vedomost:
if (m_controller->vedomostController()) {
fontSize = m_controller->vedomostController()->getFontSize();
fontStretch = m_controller->vedomostController()->getFontStretch();
}
break;
}
m_fontSizeSpinBox->setValue(fontSize);
m_fontStretchSpinBox->setValue(fontStretch);
qDebug() << "DocumentSettingsDialog::loadFontSettings: Настройки шрифта загружены - размер:" << fontSize << "поджим:" << fontStretch;
}
void DocumentSettingsDialog::saveFontSettings()
{
qDebug() << "DocumentSettingsDialog::saveFontSettings: Сохраняем настройки шрифта";
if (!m_controller || !m_fontSizeSpinBox || !m_fontStretchSpinBox) {
qDebug() << "DocumentSettingsDialog::saveFontSettings: Контроллер или виджеты недоступны";
return;
}
int fontSize = m_fontSizeSpinBox->value();
int fontStretch = m_fontStretchSpinBox->value();
// Сохраняем настройки в соответствующий контроллер
switch (m_documentType) {
case DocumentType::Perechen:
if (m_controller->perechenTableController()) {
m_controller->perechenTableController()->setFontSize(fontSize);
m_controller->perechenTableController()->setFontStretch(fontStretch);
}
break;
case DocumentType::SpecificationPCB:
if (m_controller->specificationPCBController()) {
m_controller->specificationPCBController()->setFontSize(fontSize);
m_controller->specificationPCBController()->setFontStretch(fontStretch);
}
break;
case DocumentType::Specification:
if (m_controller->specificationController()) {
m_controller->specificationController()->setFontSize(fontSize);
m_controller->specificationController()->setFontStretch(fontStretch);
}
break;
case DocumentType::Vedomost:
if (m_controller->vedomostController()) {
m_controller->vedomostController()->setFontSize(fontSize);
m_controller->vedomostController()->setFontStretch(fontStretch);
}
break;
}
// Сохраняем в БД
if (m_controller) {
m_controller->saveProjectSettingsToDatabase();
}
qDebug() << "DocumentSettingsDialog::saveFontSettings: Настройки шрифта сохранены - размер:" << fontSize << "поджим:" << fontStretch;
}
void DocumentSettingsDialog::saveTableSettings()
{
qDebug() << "DocumentSettingsDialog::saveTableSettings: Сохраняем настройки таблицы";
// Собираем текущие настройки из комбобоксов
m_currentTableMappings.clear();
for (QComboBox *comboBox : m_tableColumnComboBoxes) {
QString value = comboBox->currentText();
// Если выбрано "-- Не выбрано --", сохраняем пустую строку
if (value == "-- Не выбрано --") {
value = "";
}
m_currentTableMappings.append(value);
}
qDebug() << "DocumentSettingsDialog::saveTableSettings: Собранные настройки из комбобоксов:" << m_currentTableMappings;
// Для Perechen нужно сохранить полный список настроек (4 элемента)
if (m_documentType == DocumentType::Perechen) {
// Получаем текущие настройки из контроллера
QStringList fullMappings;
if (m_controller && m_controller->perechenTableController()) {
fullMappings = m_controller->perechenTableController()->getColumnMappings();
qDebug() << "DocumentSettingsDialog::saveTableSettings: Полные настройки из контроллера:" << fullMappings;
}
// Обновляем только те настройки, которые есть в комбобоксах
for (int i = 0; i < m_tableColumnComboBoxes.size() && i < fullMappings.size(); ++i) {
fullMappings[i] = m_currentTableMappings[i];
}
m_currentTableMappings = fullMappings;
qDebug() << "DocumentSettingsDialog::saveTableSettings: Обновленные полные настройки:" << m_currentTableMappings;
}
// Сохраняем в контроллер
if (m_controller) {
qDebug() << "DocumentSettingsDialog::saveTableSettings: Контроллер доступен";
switch (m_documentType) {
case DocumentType::Perechen:
qDebug() << "DocumentSettingsDialog::saveTableSettings: Сохраняем для Perechen";
if (m_controller->perechenTableController()) {
qDebug() << "DocumentSettingsDialog::saveTableSettings: PerechenTableController доступен";
m_controller->perechenTableController()->setColumnMappings(m_currentTableMappings);
qDebug() << "DocumentSettingsDialog::saveTableSettings: Настройки Perechen сохранены";
} else {
qDebug() << "DocumentSettingsDialog::saveTableSettings: PerechenTableController недоступен";
}
break;
case DocumentType::SpecificationPCB:
qDebug() << "DocumentSettingsDialog::saveTableSettings: Сохраняем для SpecificationPCB";
if (m_controller->specificationPCBController()) {
qDebug() << "DocumentSettingsDialog::saveTableSettings: SpecificationPCBController доступен";
m_controller->specificationPCBController()->setColumnMappings(m_currentTableMappings);
qDebug() << "DocumentSettingsDialog::saveTableSettings: Настройки SpecificationPCB сохранены";
} else {
qDebug() << "DocumentSettingsDialog::saveTableSettings: SpecificationPCBController недоступен";
}
break;
case DocumentType::Specification:
qDebug() << "DocumentSettingsDialog::saveTableSettings: Сохраняем для Specification";
if (m_controller->specificationController()) {
qDebug() << "DocumentSettingsDialog::saveTableSettings: SpecificationController доступен";
m_controller->specificationController()->setColumnMappings(m_currentTableMappings);
qDebug() << "DocumentSettingsDialog::saveTableSettings: Настройки Specification сохранены";
} else {
qDebug() << "DocumentSettingsDialog::saveTableSettings: SpecificationController недоступен";
}
break;
case DocumentType::Vedomost:
qDebug() << "DocumentSettingsDialog::saveTableSettings: Сохраняем для Vedomost";
if (m_controller->vedomostController()) {
qDebug() << "DocumentSettingsDialog::saveTableSettings: VedomostController доступен";
m_controller->vedomostController()->setColumnMappings(m_currentTableMappings);
qDebug() << "DocumentSettingsDialog::saveTableSettings: Настройки Vedomost сохранены";
} else {
qDebug() << "DocumentSettingsDialog::saveTableSettings: VedomostController недоступен";
}
break;
}
} else {
qDebug() << "DocumentSettingsDialog::saveTableSettings: Контроллер недоступен";
}
qDebug() << "DocumentSettingsDialog::saveTableSettings: Настройки таблицы сохранены:" << m_currentTableMappings;
}
void DocumentSettingsDialog::saveInscriptionSettings()
{
qDebug() << "DocumentSettingsDialog::saveInscriptionSettings: Сохраняем настройки надписей";
if (m_titleInscriptionsModel) {
QMap<int, QString> values;
for (auto it = m_inscriptionFields.begin(); it != m_inscriptionFields.end(); ++it) {
int fieldNumber = it.key();
const TitleInscriptionFieldExtended &field = it.value();
if (!field.currentValue.isEmpty()) {
values[fieldNumber] = field.currentValue;
}
}
m_titleInscriptionsModel->setAllInscriptions(values);
// Сохраняем в базу данных через контроллер
if (m_controller) {
m_controller->saveTitleInscriptionsToDatabase(values);
}
}
qDebug() << "DocumentSettingsDialog::saveInscriptionSettings: Настройки надписей сохранены";
}
// Слоты
void DocumentSettingsDialog::onTableComboBoxChanged(int columnIndex, const QString &value)
{
qDebug() << "DocumentSettingsDialog::onTableComboBoxChanged: Колонка" << columnIndex << "изменена на" << value;
// Если выбрано "-- Не выбрано --", сохраняем пустую строку
QString saveValue = (value == "-- Не выбрано --") ? "" : value;
updateTableFieldValue(columnIndex, saveValue);
// Для Perechen обновляем полный список настроек
if (m_documentType == DocumentType::Perechen && m_controller && m_controller->perechenTableController()) {
QStringList fullMappings = m_controller->perechenTableController()->getColumnMappings();
if (columnIndex < fullMappings.size()) {
fullMappings[columnIndex] = saveValue;
m_currentTableMappings = fullMappings;
qDebug() << "DocumentSettingsDialog::onTableComboBoxChanged: Обновлены полные настройки:" << m_currentTableMappings;
}
}
}
void DocumentSettingsDialog::onInscriptionComboBoxChanged(int fieldNumber, const QString &value)
{
qDebug() << "DocumentSettingsDialog::onInscriptionComboBoxChanged: Поле" << fieldNumber << "изменено на" << value;
// Получаем комбобокс для этого поля
if (m_inscriptionComboBoxes.contains(fieldNumber)) {
QComboBox *comboBox = m_inscriptionComboBoxes[fieldNumber];
// Проверяем, является ли значение одним из предустановленных параметров проекта
int index = comboBox->findText(value);
if (index >= 0) {
// Это предустановленное значение, берем данные (название поля)
QString fieldName = comboBox->itemData(index).toString();
if (!fieldName.isEmpty()) {
updateInscriptionFieldValue(fieldNumber, fieldName);
return;
}
}
// Если это не предустановленное значение, используем как есть (кастомный ввод)
updateInscriptionFieldValue(fieldNumber, value);
}
}
void DocumentSettingsDialog::onDecimalNumberComboBoxChanged(const QString &type, const QString &value)
{
qDebug() << "DocumentSettingsDialog::onDecimalNumberComboBoxChanged: Децимальный номер" << type << "изменен на" << value;
if (m_decimalNumberComboBoxes.contains(type)) {
QComboBox *comboBox = m_decimalNumberComboBoxes[type];
// Проверяем, является ли значение одним из предустановленных параметров проекта
int index = comboBox->findText(value);
if (index >= 0) {
// Это предустановленное значение, берем данные (название поля)
QString fieldName = comboBox->itemData(index).toString();
if (!fieldName.isEmpty()) {
m_decimalNumberValues[type] = fieldName;
return;
}
}
// Если это не предустановленное значение, используем как есть (кастомный ввод)
m_decimalNumberValues[type] = value;
}
}
void DocumentSettingsDialog::onZoomChanged(int value)
{
qDebug() << "DocumentSettingsDialog::onZoomChanged: Масштаб изменен на" << value;
if (m_imageView && m_imageScene) {
qreal scale = value / 100.0;
m_imageView->setTransform(QTransform::fromScale(scale, scale));
}
}
void DocumentSettingsDialog::onAccept()
{
qDebug() << "DocumentSettingsDialog::onAccept: Принимаем настройки";
saveTableSettings();
saveInscriptionSettings();
saveFontSettings();
// Сохраняем настройки децимальных номеров (только для SpecificationPCB и Specification)
if (m_documentType == DocumentType::SpecificationPCB || m_documentType == DocumentType::Specification) {
saveDecimalNumberSettings();
}
// Сохраняем настройки "Куда входит" для ведомости
if (m_documentType == DocumentType::Vedomost) {
saveDecimalNumberSettings();
}
accept();
}
void DocumentSettingsDialog::onCancel()
{
qDebug() << "DocumentSettingsDialog::onCancel: Отменяем настройки";
reject();
}
void DocumentSettingsDialog::onResetTableSettings()
{
qDebug() << "DocumentSettingsDialog::onResetTableSettings: Сбрасываем настройки таблицы";
// Для всех типов документов сбрасываем на "Не выбрано"
for (QComboBox *comboBox : m_tableColumnComboBoxes) {
comboBox->setCurrentIndex(0); // "-- Не выбрано --"
}
// Сбрасываем настройки децимальных номеров (только для SpecificationPCB и Specification)
if (m_documentType == DocumentType::SpecificationPCB || m_documentType == DocumentType::Specification) {
for (auto it = m_decimalNumberComboBoxes.begin(); it != m_decimalNumberComboBoxes.end(); ++it) {
it.value()->setCurrentIndex(0); // "-- Не выбрано --"
}
m_decimalNumberValues.clear();
}
// Сбрасываем настройки "Куда входит" для ведомости
if (m_documentType == DocumentType::Vedomost) {
if (m_decimalNumberComboBoxes.contains("whereUsed")) {
m_decimalNumberComboBoxes["whereUsed"]->setCurrentIndex(0); // "-- Не выбрано --"
}
m_decimalNumberValues.remove("whereUsed");
}
}
void DocumentSettingsDialog::onResetInscriptionSettings()
{
qDebug() << "DocumentSettingsDialog::onResetInscriptionSettings: Сбрасываем настройки надписей";
for (auto it = m_inscriptionComboBoxes.begin(); it != m_inscriptionComboBoxes.end(); ++it) {
it.value()->setCurrentIndex(0); // "-- Не выбрано --"
}
for (auto it = m_inscriptionFields.begin(); it != m_inscriptionFields.end(); ++it) {
it.value().currentValue = "";
it.value().isCustom = false;
}
}
void DocumentSettingsDialog::updateTableFieldValue(int columnIndex, const QString &value)
{
if (columnIndex < m_currentTableMappings.size()) {
m_currentTableMappings[columnIndex] = value;
qDebug() << "DocumentSettingsDialog::updateTableFieldValue: Обновлено значение колонки" << columnIndex << "на" << value;
}
}
void DocumentSettingsDialog::updateInscriptionFieldValue(int fieldNumber, const QString &value)
{
if (m_inscriptionFields.contains(fieldNumber)) {
m_inscriptionFields[fieldNumber].currentValue = value;
// Проверяем, является ли значение кастомным (не из списка параметров проекта)
bool isCustom = true;
if (m_projectParamModel) {
QMap<QString, QString> projectParams = m_projectParamModel->getDataAsMap();
isCustom = !projectParams.contains(value);
}
m_inscriptionFields[fieldNumber].isCustom = isCustom;
qDebug() << "DocumentSettingsDialog::updateInscriptionFieldValue: Обновлено значение поля" << fieldNumber << "на" << value << "isCustom:" << isCustom;
}
}
void DocumentSettingsDialog::updateDecimalNumberFieldValue(const QString &type, const QString &value)
{
if (m_decimalNumberComboBoxes.contains(type)) {
QComboBox *comboBox = m_decimalNumberComboBoxes[type];
m_decimalNumberComboBoxes[type]->setCurrentText(value);
qDebug() << "DocumentSettingsDialog::updateDecimalNumberFieldValue: Обновлено значение децимального номера" << type << "на" << value;
}
}
void DocumentSettingsDialog::loadDecimalNumberSettings()
{
qDebug() << "DocumentSettingsDialog::loadDecimalNumberSettings: Загружаем настройки децимальных номеров";
if (m_controller) {
QStringList mappings;
switch (m_documentType) {
case DocumentType::SpecificationPCB:
if (m_controller->specificationPCBController()) {
mappings = m_controller->specificationPCBController()->getColumnMappings();
}
break;
case DocumentType::Specification:
if (m_controller->specificationController()) {
mappings = m_controller->specificationController()->getColumnMappings();
}
break;
default:
break;
}
// Загружаем значения децимальных номеров и названия платы из маппингов
if (mappings.size() >= 9) { // Предполагаем, что поля находятся в позициях 6, 7 и 8
// Название платы (только для SpecificationPCB)
if (m_documentType == DocumentType::SpecificationPCB && mappings.size() > 6 && !mappings[6].isEmpty()) {
m_decimalNumberValues["boardName"] = mappings[6];
if (m_decimalNumberComboBoxes.contains("boardName")) {
int index = m_decimalNumberComboBoxes["boardName"]->findData(mappings[6]);
if (index >= 0) {
m_decimalNumberComboBoxes["boardName"]->setCurrentIndex(index);
} else {
m_decimalNumberComboBoxes["boardName"]->setCurrentText(mappings[6]);
}
}
}
// Децимальный номер платы
if (mappings.size() > 7 && !mappings[7].isEmpty()) {
m_decimalNumberValues["board"] = mappings[7];
if (m_decimalNumberComboBoxes.contains("board")) {
int index = m_decimalNumberComboBoxes["board"]->findData(mappings[7]);
if (index >= 0) {
m_decimalNumberComboBoxes["board"]->setCurrentIndex(index);
} else {
m_decimalNumberComboBoxes["board"]->setCurrentText(mappings[7]);
}
}
}
// Децимальный номер документа
if (mappings.size() > 8 && !mappings[8].isEmpty()) {
m_decimalNumberValues["document"] = mappings[8];
if (m_decimalNumberComboBoxes.contains("document")) {
int index = m_decimalNumberComboBoxes["document"]->findData(mappings[8]);
if (index >= 0) {
m_decimalNumberComboBoxes["document"]->setCurrentIndex(index);
} else {
m_decimalNumberComboBoxes["document"]->setCurrentText(mappings[8]);
}
}
}
}
// Для спецификации также загружаем значение из поля 1001 titleInscriptionsModel (децимальный номер документа)
if (m_documentType == DocumentType::Specification && m_titleInscriptionsModel && m_decimalNumberComboBoxes.contains("document")) {
QString field1001Value = m_titleInscriptionsModel->getInscriptionValue(1001);
if (!field1001Value.isEmpty()) {
QComboBox *docComboBox = m_decimalNumberComboBoxes["document"];
// Пытаемся найти значение в списке по itemData (название поля)
int index = docComboBox->findData(field1001Value);
if (index >= 0) {
docComboBox->setCurrentIndex(index);
m_decimalNumberValues["document"] = field1001Value;
} else {
// Если не найдено в списке, устанавливаем как кастомный текст
docComboBox->setCurrentText(field1001Value);
m_decimalNumberValues["document"] = field1001Value;
}
qDebug() << "DocumentSettingsDialog::loadDecimalNumberSettings: Загружено значение документа из поля 1001:" << field1001Value;
}
}
// Для спецификации также загружаем значение "Название документа" из поля 1002 titleInscriptionsModel
if (m_documentType == DocumentType::Specification && m_titleInscriptionsModel && m_decimalNumberComboBoxes.contains("documentName")) {
QString field1002Value = m_titleInscriptionsModel->getInscriptionValue(1002);
if (!field1002Value.isEmpty()) {
QComboBox *documentNameComboBox = m_decimalNumberComboBoxes["documentName"];
// Пытаемся найти значение в списке по itemData (название поля)
int index = documentNameComboBox->findData(field1002Value);
if (index >= 0) {
documentNameComboBox->setCurrentIndex(index);
m_decimalNumberValues["documentName"] = field1002Value;
} else {
// Если не найдено в списке, устанавливаем как кастомный текст
documentNameComboBox->setCurrentText(field1002Value);
m_decimalNumberValues["documentName"] = field1002Value;
}
qDebug() << "DocumentSettingsDialog::loadDecimalNumberSettings: Загружено значение названия документа из поля 1002:" << field1002Value;
}
}
// Для ведомости загружаем значение "Куда входит" из columnMappings[4]
if (m_documentType == DocumentType::Vedomost) {
if (m_controller->vedomostController()) {
mappings = m_controller->vedomostController()->getColumnMappings();
// Поле "WhereUsed" находится в позиции 4
if (mappings.size() > 4 && !mappings[4].isEmpty()) {
m_decimalNumberValues["whereUsed"] = mappings[4];
if (m_decimalNumberComboBoxes.contains("whereUsed")) {
QComboBox *whereUsedComboBox = m_decimalNumberComboBoxes["whereUsed"];
int index = whereUsedComboBox->findData(mappings[4]);
if (index >= 0) {
whereUsedComboBox->setCurrentIndex(index);
} else {
whereUsedComboBox->setCurrentText(mappings[4]);
}
qDebug() << "DocumentSettingsDialog::loadDecimalNumberSettings: Загружено значение 'Куда входит':" << mappings[4];
}
}
}
}
}
qDebug() << "DocumentSettingsDialog::loadDecimalNumberSettings: Настройки децимальных номеров загружены:" << m_decimalNumberValues;
}
void DocumentSettingsDialog::saveDecimalNumberSettings()
{
qDebug() << "DocumentSettingsDialog::saveDecimalNumberSettings: Сохраняем настройки децимальных номеров";
if (m_controller) {
QStringList mappings;
switch (m_documentType) {
case DocumentType::SpecificationPCB:
if (m_controller->specificationPCBController()) {
mappings = m_controller->specificationPCBController()->getColumnMappings();
}
break;
case DocumentType::Specification:
if (m_controller->specificationController()) {
mappings = m_controller->specificationController()->getColumnMappings();
}
break;
default:
break;
}
// Расширяем маппинги до нужного размера
while (mappings.size() < 9) {
mappings.append("");
}
// Устанавливаем значения полей
if (m_documentType == DocumentType::SpecificationPCB) {
mappings[6] = m_decimalNumberValues.value("boardName", ""); // Название платы
}
mappings[7] = m_decimalNumberValues.value("board", ""); // Децимальный номер платы
mappings[8] = m_decimalNumberValues.value("document", ""); // Децимальный номер документа
// Сохраняем обновленные маппинги
switch (m_documentType) {
case DocumentType::SpecificationPCB:
if (m_controller->specificationPCBController()) {
m_controller->specificationPCBController()->setColumnMappings(mappings);
}
break;
case DocumentType::Specification:
if (m_controller->specificationController()) {
m_controller->specificationController()->setColumnMappings(mappings);
}
// Для спецификации сохраняем значение из docComboBox в titleInscriptionsModel с полем 1001 (децимальный номер документа)
if (m_titleInscriptionsModel && m_decimalNumberComboBoxes.contains("document")) {
QComboBox *docComboBox = m_decimalNumberComboBoxes["document"];
QString docValue = docComboBox->currentText();
// Если выбрано "-- Не выбрано --", очищаем поле
if (docValue == "-- Не выбрано --" || docValue.isEmpty()) {
m_titleInscriptionsModel->setInscriptionValue(1001, "");
} else {
// Получаем значение: если это предустановленное значение, берем itemData, иначе текст
int index = docComboBox->findText(docValue);
if (index >= 0) {
QString fieldName = docComboBox->itemData(index).toString();
if (!fieldName.isEmpty()) {
// Это предустановленное значение - сохраняем название поля
m_titleInscriptionsModel->setInscriptionValue(1001, fieldName);
} else {
// Это кастомный ввод - сохраняем текст
m_titleInscriptionsModel->setInscriptionValue(1001, docValue);
}
} else {
// Кастомный ввод - сохраняем текст
m_titleInscriptionsModel->setInscriptionValue(1001, docValue);
}
}
qDebug() << "DocumentSettingsDialog::saveDecimalNumberSettings: Сохранено значение документа в поле 1001:" << m_titleInscriptionsModel->getInscriptionValue(1001);
}
// Для спецификации сохраняем значение "Название документа" из documentNameComboBox в titleInscriptionsModel с полем 1002
if (m_titleInscriptionsModel && m_decimalNumberComboBoxes.contains("documentName")) {
QComboBox *documentNameComboBox = m_decimalNumberComboBoxes["documentName"];
QString documentNameValue = documentNameComboBox->currentText();
// Если выбрано "-- Не выбрано --", очищаем поле
if (documentNameValue == "-- Не выбрано --" || documentNameValue.isEmpty()) {
m_titleInscriptionsModel->setInscriptionValue(1002, "");
} else {
// Получаем значение: если это предустановленное значение, берем itemData, иначе текст
int index = documentNameComboBox->findText(documentNameValue);
if (index >= 0) {
QString fieldName = documentNameComboBox->itemData(index).toString();
if (!fieldName.isEmpty()) {
// Это предустановленное значение - сохраняем название поля
m_titleInscriptionsModel->setInscriptionValue(1002, fieldName);
} else {
// Это кастомный ввод - сохраняем текст
m_titleInscriptionsModel->setInscriptionValue(1002, documentNameValue);
}
} else {
// Кастомный ввод - сохраняем текст
m_titleInscriptionsModel->setInscriptionValue(1002, documentNameValue);
}
}
qDebug() << "DocumentSettingsDialog::saveDecimalNumberSettings: Сохранено значение названия документа в поле 1002:" << m_titleInscriptionsModel->getInscriptionValue(1002);
}
break;
case DocumentType::Vedomost:
// Для ведомости сохраняем значение "Куда входит" в columnMappings[4]
if (m_controller->vedomostController()) {
mappings = m_controller->vedomostController()->getColumnMappings();
// Расширяем маппинги до нужного размера
while (mappings.size() < 5) {
mappings.append("");
}
// Устанавливаем значение "Куда входит" в позицию 4
if (m_decimalNumberComboBoxes.contains("whereUsed")) {
QComboBox *whereUsedComboBox = m_decimalNumberComboBoxes["whereUsed"];
QString whereUsedValue = whereUsedComboBox->currentText();
// Если выбрано "-- Не выбрано --", очищаем поле
if (whereUsedValue == "-- Не выбрано --" || whereUsedValue.isEmpty()) {
mappings[4] = "";
} else {
// Получаем значение: если это предустановленное значение, берем itemData, иначе текст
int index = whereUsedComboBox->findText(whereUsedValue);
if (index >= 0) {
QString fieldName = whereUsedComboBox->itemData(index).toString();
if (!fieldName.isEmpty()) {
// Это предустановленное значение - сохраняем название поля
mappings[4] = fieldName;
} else {
// Это кастомный ввод - сохраняем текст
mappings[4] = whereUsedValue;
}
} else {
// Кастомный ввод - сохраняем текст
mappings[4] = whereUsedValue;
}
}
}
m_controller->vedomostController()->setColumnMappings(mappings);
qDebug() << "DocumentSettingsDialog::saveDecimalNumberSettings: Сохранено значение 'Куда входит':" << mappings[4];
}
break;
default:
break;
}
qDebug() << "DocumentSettingsDialog::saveDecimalNumberSettings: Настройки децимальных номеров сохранены:" << m_decimalNumberValues;
}
}
// Публичные методы
QStringList DocumentSettingsDialog::getTableColumnMappings() const
{
return m_currentTableMappings;
}
void DocumentSettingsDialog::setTableColumnMappings(const QStringList &mappings)
{
m_currentTableMappings = mappings;
loadTableSettings();
}
QMap<int, QString> DocumentSettingsDialog::getTitleInscriptionValues() const
{
QMap<int, QString> values;
for (auto it = m_inscriptionFields.begin(); it != m_inscriptionFields.end(); ++it) {
if (!it.value().currentValue.isEmpty()) {
values[it.key()] = it.value().currentValue;
}
}
return values;
}
void DocumentSettingsDialog::setTitleInscriptionValues(const QMap<int, QString> &values)
{
for (auto it = values.begin(); it != values.end(); ++it) {
if (m_inscriptionFields.contains(it.key())) {
m_inscriptionFields[it.key()].currentValue = it.value();
}
}
loadInscriptionSettings();
}
void DocumentSettingsDialog::setTitleInscriptionsModel(TitleInscriptionsModel *model)
{
m_titleInscriptionsModel = model;
loadInscriptionSettings();
}
TitleInscriptionsModel* DocumentSettingsDialog::getTitleInscriptionsModel() const
{
return m_titleInscriptionsModel;
}
// Методы для работы с децимальными номерами
QMap<QString, QString> DocumentSettingsDialog::getDecimalNumberValues() const
{
return m_decimalNumberValues;
}
void DocumentSettingsDialog::setDecimalNumberValues(const QMap<QString, QString> &values)
{
m_decimalNumberValues = values;
if (m_documentType == DocumentType::SpecificationPCB || m_documentType == DocumentType::Specification) {
loadDecimalNumberSettings();
}
if (m_documentType == DocumentType::Vedomost) {
loadDecimalNumberSettings();
}
}