267 lines
11 KiB
C++
267 lines
11 KiB
C++
#include "pagebreakconfirmationdialog.h"
|
|
#include <QVBoxLayout>
|
|
#include <QHBoxLayout>
|
|
#include <QLabel>
|
|
#include <QPushButton>
|
|
#include <QCheckBox>
|
|
#include <QTextEdit>
|
|
#include <QScrollArea>
|
|
#include <QGroupBox>
|
|
#include <QApplication>
|
|
#include <QScreen>
|
|
#include <QStyle>
|
|
|
|
PageBreakConfirmationDialog::PageBreakConfirmationDialog(const QList<PageBreakInfo> &pageBreakInfos, QWidget *parent)
|
|
: QDialog(parent)
|
|
, m_pageBreakInfos(pageBreakInfos)
|
|
, m_showDialogInFuture(true)
|
|
{
|
|
setWindowTitle("Подтверждение переноса заголовков");
|
|
setModal(true);
|
|
setMinimumSize(700, 500);
|
|
|
|
// Центрируем диалог на экране
|
|
if (parent) {
|
|
move(parent->window()->frameGeometry().center() - frameGeometry().center());
|
|
}
|
|
|
|
setupUI();
|
|
updateDetailsText();
|
|
}
|
|
|
|
void PageBreakConfirmationDialog::setupUI()
|
|
{
|
|
m_mainLayout = new QVBoxLayout(this);
|
|
|
|
// Заголовок
|
|
m_titleLabel = new QLabel("Обнаружены заголовки, требующие переноса на следующую страницу");
|
|
m_titleLabel->setStyleSheet("font-size: 14px; font-weight: bold; margin: 10px;");
|
|
m_mainLayout->addWidget(m_titleLabel);
|
|
|
|
// Описание
|
|
m_descriptionLabel = new QLabel(QString("Найдено %1 заголовков, которые могут быть разорваны между страницами. "
|
|
"Выберите, какие заголовки нужно защитить от разрыва.")
|
|
.arg(m_pageBreakInfos.size()));
|
|
m_descriptionLabel->setWordWrap(true);
|
|
m_descriptionLabel->setStyleSheet("margin: 10px;");
|
|
m_mainLayout->addWidget(m_descriptionLabel);
|
|
|
|
// Чекбокс "Выбрать все"
|
|
m_selectAllCheckBox = new QCheckBox("Выбрать все");
|
|
m_selectAllCheckBox->setChecked(true);
|
|
m_selectAllCheckBox->setTristate(false);
|
|
m_selectAllCheckBox->setStyleSheet("font-weight: bold; margin: 5px;");
|
|
m_mainLayout->addWidget(m_selectAllCheckBox);
|
|
|
|
// Область с чекбоксами для каждой строки
|
|
m_checkBoxesScrollArea = new QScrollArea();
|
|
m_checkBoxesScrollArea->setWidgetResizable(true);
|
|
m_checkBoxesScrollArea->setMaximumHeight(200);
|
|
m_checkBoxesScrollArea->setFrameStyle(QFrame::Box);
|
|
|
|
QWidget *checkBoxesWidget = new QWidget();
|
|
QVBoxLayout *checkBoxesLayout = new QVBoxLayout(checkBoxesWidget);
|
|
|
|
// Создаем чекбоксы для каждой строки
|
|
for (const PageBreakInfo &info : m_pageBreakInfos) {
|
|
QString checkBoxText = QString("Строка %1: \"%2\" (стр. %3 → %4, +%5 пустых)")
|
|
.arg(info.rowIndex + 1)
|
|
.arg(info.headerText)
|
|
.arg(info.currentPage)
|
|
.arg(info.nextPage)
|
|
.arg(info.emptyRowsToAdd);
|
|
|
|
QCheckBox *checkBox = new QCheckBox(checkBoxText);
|
|
checkBox->setChecked(true); // По умолчанию выбрано
|
|
checkBox->setStyleSheet("margin: 2px; padding: 2px;");
|
|
|
|
m_rowCheckBoxes.append(checkBox);
|
|
checkBoxesLayout->addWidget(checkBox);
|
|
|
|
// Подключаем сигнал для обновления состояния "Выбрать все"
|
|
connect(checkBox, &QCheckBox::toggled, this, &PageBreakConfirmationDialog::updateSelectAllCheckBox);
|
|
}
|
|
|
|
m_checkBoxesScrollArea->setWidget(checkBoxesWidget);
|
|
m_mainLayout->addWidget(m_checkBoxesScrollArea);
|
|
|
|
// Чекбокс для показа деталей
|
|
m_showDetailsCheckBox = new QCheckBox("Показать детали");
|
|
m_showDetailsCheckBox->setChecked(false);
|
|
m_mainLayout->addWidget(m_showDetailsCheckBox);
|
|
|
|
// Текстовое поле с деталями (скрыто по умолчанию)
|
|
m_detailsTextEdit = new QTextEdit();
|
|
m_detailsTextEdit->setReadOnly(true);
|
|
m_detailsTextEdit->setMaximumHeight(150);
|
|
m_detailsTextEdit->setVisible(false);
|
|
m_mainLayout->addWidget(m_detailsTextEdit);
|
|
|
|
// Чекбокс для запоминания выбора
|
|
m_rememberChoiceCheckBox = new QCheckBox("Запомнить мой выбор и не спрашивать в будущем");
|
|
m_mainLayout->addWidget(m_rememberChoiceCheckBox);
|
|
|
|
// Кнопки
|
|
QHBoxLayout *buttonLayout = new QHBoxLayout();
|
|
|
|
m_confirmAllButton = new QPushButton("Подтвердить все");
|
|
m_confirmAllButton->setStyleSheet("QPushButton { background-color: #4CAF50; color: white; padding: 8px 16px; border: none; border-radius: 4px; }"
|
|
"QPushButton:hover { background-color: #45a049; }");
|
|
|
|
m_confirmSelectedButton = new QPushButton("Подтвердить выбранные");
|
|
m_confirmSelectedButton->setStyleSheet("QPushButton { background-color: #2196F3; color: white; padding: 8px 16px; border: none; border-radius: 4px; }"
|
|
"QPushButton:hover { background-color: #1976D2; }");
|
|
|
|
m_skipAllButton = new QPushButton("Пропустить все");
|
|
m_skipAllButton->setStyleSheet("QPushButton { background-color: #FF9800; color: white; padding: 8px 16px; border: none; border-radius: 4px; }"
|
|
"QPushButton:hover { background-color: #F57C00; }");
|
|
|
|
m_cancelButton = new QPushButton("Отмена");
|
|
m_cancelButton->setStyleSheet("QPushButton { background-color: #f44336; color: white; padding: 8px 16px; border: none; border-radius: 4px; }"
|
|
"QPushButton:hover { background-color: #da190b; }");
|
|
|
|
buttonLayout->addWidget(m_confirmAllButton);
|
|
buttonLayout->addWidget(m_confirmSelectedButton);
|
|
buttonLayout->addWidget(m_skipAllButton);
|
|
buttonLayout->addStretch();
|
|
buttonLayout->addWidget(m_cancelButton);
|
|
|
|
m_mainLayout->addLayout(buttonLayout);
|
|
|
|
// Подключаем сигналы
|
|
connect(m_confirmAllButton, &QPushButton::clicked, this, &PageBreakConfirmationDialog::onConfirmAllClicked);
|
|
connect(m_confirmSelectedButton, &QPushButton::clicked, this, &PageBreakConfirmationDialog::onConfirmSelectedClicked);
|
|
connect(m_skipAllButton, &QPushButton::clicked, this, &PageBreakConfirmationDialog::onSkipAllClicked);
|
|
connect(m_cancelButton, &QPushButton::clicked, this, &QDialog::reject);
|
|
connect(m_showDetailsCheckBox, &QCheckBox::toggled, this, &PageBreakConfirmationDialog::onDetailsToggled);
|
|
connect(m_selectAllCheckBox, &QCheckBox::toggled, this, &PageBreakConfirmationDialog::onSelectAllToggled);
|
|
|
|
// По умолчанию подтверждаем все строки
|
|
for (const PageBreakInfo &info : m_pageBreakInfos) {
|
|
m_confirmedRows.append(info.rowIndex);
|
|
}
|
|
}
|
|
|
|
void PageBreakConfirmationDialog::updateDetailsText()
|
|
{
|
|
QString detailsText;
|
|
detailsText += "<h3>Детали переноса заголовков:</h3>\n";
|
|
|
|
for (const PageBreakInfo &info : m_pageBreakInfos) {
|
|
detailsText += QString("<p><b>Строка %1:</b> \"%2\"</p>\n")
|
|
.arg(info.rowIndex + 1)
|
|
.arg(info.headerText);
|
|
detailsText += QString("<p> • Текущая страница: %1</p>\n").arg(info.currentPage);
|
|
detailsText += QString("<p> • Следующая страница: %1</p>\n").arg(info.nextPage);
|
|
detailsText += QString("<p> • Добавится пустых строк: %1</p>\n").arg(info.emptyRowsToAdd);
|
|
detailsText += "<hr>\n";
|
|
}
|
|
|
|
m_detailsTextEdit->setHtml(detailsText);
|
|
}
|
|
|
|
void PageBreakConfirmationDialog::onConfirmAllClicked()
|
|
{
|
|
// Выбираем все строки
|
|
m_selectAllCheckBox->setChecked(true);
|
|
for (QCheckBox *checkBox : m_rowCheckBoxes) {
|
|
checkBox->setChecked(true);
|
|
}
|
|
|
|
// Подтверждаем все
|
|
m_confirmedRows.clear();
|
|
for (const PageBreakInfo &info : m_pageBreakInfos) {
|
|
m_confirmedRows.append(info.rowIndex);
|
|
}
|
|
|
|
m_showDialogInFuture = !m_rememberChoiceCheckBox->isChecked();
|
|
accept();
|
|
}
|
|
|
|
void PageBreakConfirmationDialog::onConfirmSelectedClicked()
|
|
{
|
|
// Подтверждаем только выбранные строки
|
|
m_confirmedRows.clear();
|
|
for (int i = 0; i < m_rowCheckBoxes.size(); ++i) {
|
|
if (m_rowCheckBoxes[i]->isChecked()) {
|
|
m_confirmedRows.append(m_pageBreakInfos[i].rowIndex);
|
|
}
|
|
}
|
|
|
|
m_showDialogInFuture = !m_rememberChoiceCheckBox->isChecked();
|
|
accept();
|
|
}
|
|
|
|
void PageBreakConfirmationDialog::onSkipAllClicked()
|
|
{
|
|
// Снимаем выбор со всех строк
|
|
m_selectAllCheckBox->setChecked(false);
|
|
for (QCheckBox *checkBox : m_rowCheckBoxes) {
|
|
checkBox->setChecked(false);
|
|
}
|
|
|
|
m_confirmedRows.clear();
|
|
m_showDialogInFuture = !m_rememberChoiceCheckBox->isChecked();
|
|
accept();
|
|
}
|
|
|
|
void PageBreakConfirmationDialog::onDetailsToggled(bool checked)
|
|
{
|
|
m_detailsTextEdit->setVisible(checked);
|
|
if (checked) {
|
|
resize(width(), height() + 150);
|
|
} else {
|
|
resize(width(), height() - 150);
|
|
}
|
|
}
|
|
|
|
void PageBreakConfirmationDialog::onSelectAllToggled(bool checked)
|
|
{
|
|
// Блокируем сигналы, чтобы избежать рекурсии
|
|
for (QCheckBox *checkBox : m_rowCheckBoxes) {
|
|
checkBox->blockSignals(true);
|
|
checkBox->setChecked(checked);
|
|
checkBox->blockSignals(false);
|
|
}
|
|
}
|
|
|
|
void PageBreakConfirmationDialog::updateSelectAllCheckBox()
|
|
{
|
|
// Проверяем, все ли чекбоксы выбраны
|
|
bool allChecked = true;
|
|
bool anyChecked = false;
|
|
|
|
for (QCheckBox *checkBox : m_rowCheckBoxes) {
|
|
if (checkBox->isChecked()) {
|
|
anyChecked = true;
|
|
} else {
|
|
allChecked = false;
|
|
}
|
|
}
|
|
|
|
// Блокируем сигналы, чтобы избежать рекурсии
|
|
m_selectAllCheckBox->blockSignals(true);
|
|
|
|
if (allChecked) {
|
|
m_selectAllCheckBox->setChecked(true);
|
|
m_selectAllCheckBox->setTristate(false);
|
|
} else if (anyChecked) {
|
|
m_selectAllCheckBox->setTristate(true);
|
|
m_selectAllCheckBox->setCheckState(Qt::PartiallyChecked);
|
|
} else {
|
|
m_selectAllCheckBox->setChecked(false);
|
|
m_selectAllCheckBox->setTristate(false);
|
|
}
|
|
|
|
m_selectAllCheckBox->blockSignals(false);
|
|
}
|
|
|
|
QList<int> PageBreakConfirmationDialog::getConfirmedRows() const
|
|
{
|
|
return m_confirmedRows;
|
|
}
|
|
|
|
bool PageBreakConfirmationDialog::shouldShowDialogInFuture() const
|
|
{
|
|
return m_showDialogInFuture;
|
|
}
|