215 lines
7.9 KiB
C++
215 lines
7.9 KiB
C++
#include "designatormappingdialog.h"
|
|
#include "adddesignatordialog.h"
|
|
#include <QMessageBox>
|
|
#include <QInputDialog>
|
|
#include <QApplication>
|
|
#include <QRegularExpression>
|
|
|
|
DesignatorMappingDialog::DesignatorMappingDialog(DesignatorMappingModel *mappingModel, QWidget *parent)
|
|
: QDialog(parent)
|
|
, m_mappingModel(mappingModel)
|
|
{
|
|
setUp();
|
|
}
|
|
|
|
void DesignatorMappingDialog::setUp()
|
|
{
|
|
setWindowTitle(tr("Настройки маппинга дезигнаторов"));
|
|
setModal(true);
|
|
resize(800, 600);
|
|
|
|
// Создаем модель таблицы
|
|
m_tableModel = new DesignatorMappingTableModel(m_mappingModel, this);
|
|
|
|
setUpLayout();
|
|
setUpConnections();
|
|
updateButtons();
|
|
}
|
|
|
|
void DesignatorMappingDialog::setUpLayout()
|
|
{
|
|
QVBoxLayout *mainLayout = new QVBoxLayout(this);
|
|
|
|
// Группа фильтров
|
|
m_filterGroupBox = new QGroupBox(tr("Фильтры"), this);
|
|
QHBoxLayout *filterLayout = new QHBoxLayout(m_filterGroupBox);
|
|
|
|
QLabel *filterLabel = new QLabel(tr("Поиск:"), this);
|
|
m_filterEdit = new QLineEdit(this);
|
|
m_filterEdit->setPlaceholderText(tr("Введите текст для поиска..."));
|
|
|
|
m_showOnlyCustomCheckBox = new QCheckBox(tr("Только пользовательские"), this);
|
|
|
|
filterLayout->addWidget(filterLabel);
|
|
filterLayout->addWidget(m_filterEdit);
|
|
filterLayout->addWidget(m_showOnlyCustomCheckBox);
|
|
filterLayout->addStretch();
|
|
|
|
// Группа таблицы
|
|
m_tableGroupBox = new QGroupBox(tr("Маппинг дезигнаторов"), this);
|
|
QVBoxLayout *tableLayout = new QVBoxLayout(m_tableGroupBox);
|
|
|
|
m_tableView = new QTableView(this);
|
|
m_tableView->setModel(m_tableModel);
|
|
m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
m_tableView->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
m_tableView->setAlternatingRowColors(true);
|
|
m_tableView->setSortingEnabled(true);
|
|
m_tableView->horizontalHeader()->setStretchLastSection(true);
|
|
m_tableView->horizontalHeader()->setSectionsClickable(true);
|
|
|
|
// Настройка размеров колонок
|
|
m_tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); // Дезигнатор
|
|
m_tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); // Единственное число
|
|
m_tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch); // Множественное число
|
|
m_tableView->horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents); // Пользовательское
|
|
|
|
tableLayout->addWidget(m_tableView);
|
|
|
|
// Группа кнопок
|
|
m_buttonsGroupBox = new QGroupBox(this);
|
|
QHBoxLayout *buttonsLayout = new QHBoxLayout(m_buttonsGroupBox);
|
|
|
|
m_addButton = new QPushButton(tr("Добавить"), this);
|
|
m_removeButton = new QPushButton(tr("Удалить"), this);
|
|
m_resetButton = new QPushButton(tr("Сбросить к умолчанию"), this);
|
|
m_saveButton = new QPushButton(tr("Сохранить"), this);
|
|
|
|
buttonsLayout->addWidget(m_addButton);
|
|
buttonsLayout->addWidget(m_removeButton);
|
|
buttonsLayout->addStretch();
|
|
buttonsLayout->addWidget(m_resetButton);
|
|
buttonsLayout->addWidget(m_saveButton);
|
|
|
|
// Кнопки диалога
|
|
QHBoxLayout *dialogButtonsLayout = new QHBoxLayout;
|
|
m_okButton = new QPushButton(tr("OK"), this);
|
|
m_cancelButton = new QPushButton(tr("Отмена"), this);
|
|
|
|
dialogButtonsLayout->addStretch();
|
|
dialogButtonsLayout->addWidget(m_okButton);
|
|
dialogButtonsLayout->addWidget(m_cancelButton);
|
|
|
|
// Добавляем все в основной layout
|
|
mainLayout->addWidget(m_filterGroupBox);
|
|
mainLayout->addWidget(m_tableGroupBox);
|
|
mainLayout->addWidget(m_buttonsGroupBox);
|
|
mainLayout->addLayout(dialogButtonsLayout);
|
|
|
|
setLayout(mainLayout);
|
|
}
|
|
|
|
void DesignatorMappingDialog::setUpConnections()
|
|
{
|
|
// Соединения для фильтров
|
|
connect(m_filterEdit, &QLineEdit::textChanged,
|
|
this, &DesignatorMappingDialog::onFilterTextChanged);
|
|
connect(m_showOnlyCustomCheckBox, &QCheckBox::toggled,
|
|
this, &DesignatorMappingDialog::onShowOnlyCustomChanged);
|
|
|
|
// Соединения для кнопок
|
|
connect(m_addButton, &QPushButton::clicked,
|
|
this, &DesignatorMappingDialog::onAddMapping);
|
|
connect(m_removeButton, &QPushButton::clicked,
|
|
this, &DesignatorMappingDialog::onRemoveMapping);
|
|
connect(m_resetButton, &QPushButton::clicked,
|
|
this, &DesignatorMappingDialog::onResetToDefaults);
|
|
connect(m_saveButton, &QPushButton::clicked,
|
|
this, &DesignatorMappingDialog::onSaveSettings);
|
|
|
|
// Соединения для кнопок диалога
|
|
connect(m_okButton, &QPushButton::clicked,
|
|
this, &QDialog::accept);
|
|
connect(m_cancelButton, &QPushButton::clicked,
|
|
this, &QDialog::reject);
|
|
|
|
// Соединения для выбора в таблице
|
|
connect(m_tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
|
|
this, &DesignatorMappingDialog::onSelectionChanged);
|
|
}
|
|
|
|
void DesignatorMappingDialog::updateButtons()
|
|
{
|
|
QModelIndex currentIndex = m_tableView->currentIndex();
|
|
bool hasSelection = currentIndex.isValid();
|
|
|
|
m_removeButton->setEnabled(hasSelection);
|
|
}
|
|
|
|
void DesignatorMappingDialog::onAddMapping()
|
|
{
|
|
AddDesignatorDialog dialog(this);
|
|
if (dialog.exec() == QDialog::Accepted) {
|
|
QString designator = dialog.getDesignator();
|
|
|
|
// Проверяем, не существует ли уже такой дезигнатор
|
|
if (m_mappingModel) {
|
|
QList<DesignatorMappingItem> mappings = m_mappingModel->mappings();
|
|
for (const auto &item : mappings) {
|
|
if (item.designator == designator) {
|
|
QMessageBox::warning(this, tr("Ошибка"),
|
|
tr("Дезигнатор '%1' уже существует.").arg(designator));
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
DesignatorMappingItem newItem = dialog.getMapping();
|
|
m_tableModel->addMapping(newItem);
|
|
}
|
|
}
|
|
|
|
void DesignatorMappingDialog::onRemoveMapping()
|
|
{
|
|
QModelIndex currentIndex = m_tableView->currentIndex();
|
|
if (!currentIndex.isValid()) {
|
|
return;
|
|
}
|
|
|
|
DesignatorMappingItem item = m_tableModel->getMapping(currentIndex.row());
|
|
|
|
int result = QMessageBox::question(this, tr("Подтверждение удаления"),
|
|
tr("Удалить маппинг для дезигнатора '%1'?").arg(item.designator),
|
|
QMessageBox::Yes | QMessageBox::No);
|
|
|
|
if (result == QMessageBox::Yes) {
|
|
m_tableModel->removeMapping(currentIndex.row());
|
|
}
|
|
}
|
|
|
|
void DesignatorMappingDialog::onResetToDefaults()
|
|
{
|
|
int result = QMessageBox::question(this, tr("Сброс к умолчанию"),
|
|
tr("Все пользовательские настройки будут удалены. Продолжить?"),
|
|
QMessageBox::Yes | QMessageBox::No);
|
|
|
|
if (result == QMessageBox::Yes) {
|
|
if (m_mappingModel) {
|
|
m_mappingModel->resetToDefaults();
|
|
}
|
|
}
|
|
}
|
|
|
|
void DesignatorMappingDialog::onSaveSettings()
|
|
{
|
|
if (m_mappingModel) {
|
|
m_mappingModel->saveToDatabase();
|
|
QMessageBox::information(this, tr("Сохранение"),
|
|
tr("Настройки успешно сохранены в базе данных."));
|
|
}
|
|
}
|
|
|
|
void DesignatorMappingDialog::onFilterTextChanged(const QString &text)
|
|
{
|
|
m_tableModel->setFilterText(text);
|
|
}
|
|
|
|
void DesignatorMappingDialog::onShowOnlyCustomChanged(bool checked)
|
|
{
|
|
m_tableModel->setShowOnlyCustom(checked);
|
|
}
|
|
|
|
void DesignatorMappingDialog::onSelectionChanged()
|
|
{
|
|
updateButtons();
|
|
}
|