#include "pagebreakconfirmationdialog.h" #include #include #include #include #include #include #include #include #include #include #include PageBreakConfirmationDialog::PageBreakConfirmationDialog(const QList &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 += "

Детали переноса заголовков:

\n"; for (const PageBreakInfo &info : m_pageBreakInfos) { detailsText += QString("

Строка %1: \"%2\"

\n") .arg(info.rowIndex + 1) .arg(info.headerText); detailsText += QString("

• Текущая страница: %1

\n").arg(info.currentPage); detailsText += QString("

• Следующая страница: %1

\n").arg(info.nextPage); detailsText += QString("

• Добавится пустых строк: %1

\n").arg(info.emptyRowsToAdd); detailsText += "
\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 PageBreakConfirmationDialog::getConfirmedRows() const { return m_confirmedRows; } bool PageBreakConfirmationDialog::shouldShowDialogInFuture() const { return m_showDialogInFuture; }