Button groups can span multiple pages

The code needs to be aware of that.

BUG: 479942
This commit is contained in:
Sune Vuorela 2024-01-25 22:14:54 +00:00 committed by Albert Astals Cid
parent 91de248ccb
commit 12e40e0d36
3 changed files with 46 additions and 19 deletions

View File

@ -602,32 +602,21 @@ EditFormButtonsCommand::EditFormButtonsCommand(Okular::DocumentPrivate *docPriv,
setText(i18nc("Edit the state of a group of form buttons", "edit form button states"));
for (const FormFieldButton *formButton : std::as_const(m_formButtons)) {
m_prevButtonStates.append(formButton->state());
m_pageNumbers.append(formButton->page()->number());
}
}
void EditFormButtonsCommand::undo()
{
clearFormButtonStates();
QSet<int> extraPages;
for (int i = 0; i < m_formButtons.size(); i++) {
bool checked = m_prevButtonStates.at(i);
if (checked) {
m_formButtons.at(i)->setState(checked);
}
}
Okular::NormalizedRect boundingRect = buildBoundingRectangleForButtons(m_formButtons);
moveViewportIfBoundingRectNotFullyVisible(boundingRect, m_docPriv, m_pageNumber);
Q_EMIT m_docPriv->m_parent->formButtonsChangedByUndoRedo(m_pageNumber, m_formButtons);
m_docPriv->notifyFormChanges(m_pageNumber);
}
void EditFormButtonsCommand::redo()
{
clearFormButtonStates();
for (int i = 0; i < m_formButtons.size(); i++) {
bool checked = m_newButtonStates.at(i);
if (checked) {
m_formButtons.at(i)->setState(checked);
if (m_pageNumbers.at(i) != m_pageNumber) {
extraPages << m_pageNumbers.at(i);
}
}
@ -635,14 +624,40 @@ void EditFormButtonsCommand::redo()
moveViewportIfBoundingRectNotFullyVisible(boundingRect, m_docPriv, m_pageNumber);
Q_EMIT m_docPriv->m_parent->formButtonsChangedByUndoRedo(m_pageNumber, m_formButtons);
m_docPriv->notifyFormChanges(m_pageNumber);
for (auto page : std::as_const(extraPages)) {
m_docPriv->notifyFormChanges(page);
}
}
void EditFormButtonsCommand::redo()
{
clearFormButtonStates();
QSet<int> extraPages;
for (int i = 0; i < m_formButtons.size(); i++) {
bool checked = m_newButtonStates.at(i);
if (checked) {
m_formButtons.at(i)->setState(checked);
}
if (m_pageNumbers.at(i) != m_pageNumber) {
extraPages << m_pageNumbers.at(i);
}
}
Okular::NormalizedRect boundingRect = buildBoundingRectangleForButtons(m_formButtons);
moveViewportIfBoundingRectNotFullyVisible(boundingRect, m_docPriv, m_pageNumber);
Q_EMIT m_docPriv->m_parent->formButtonsChangedByUndoRedo(m_pageNumber, m_formButtons);
m_docPriv->notifyFormChanges(m_pageNumber);
for (auto page : std::as_const(extraPages)) {
m_docPriv->notifyFormChanges(page);
}
}
bool EditFormButtonsCommand::refreshInternalPageReferences(const QVector<Okular::Page *> &newPagesVector)
{
const QList<FormFieldButton *> oldFormButtons = m_formButtons;
m_formButtons.clear();
for (FormFieldButton *oldFormButton : oldFormButtons) {
FormFieldButton *button = dynamic_cast<FormFieldButton *>(Okular::PagePrivate::findEquivalentForm(newPagesVector[m_pageNumber], oldFormButton));
for (int i = 0; i < oldFormButtons.size(); i++) {
FormFieldButton *button = dynamic_cast<FormFieldButton *>(Okular::PagePrivate::findEquivalentForm(newPagesVector[m_pageNumbers[i]], oldFormButtons[i]));
if (!button) {
return false;
}

View File

@ -250,6 +250,7 @@ private:
Okular::DocumentPrivate *m_docPriv;
int m_pageNumber;
QList<FormFieldButton *> m_formButtons;
QList<int> m_pageNumbers;
QList<bool> m_newButtonStates;
QList<bool> m_prevButtonStates;
};

View File

@ -9,6 +9,7 @@
*/
#include "formwidgets.h"
#include "core/page.h"
#include "pageview.h"
#include "pageviewutils.h"
#include "revisionviewer.h"
@ -212,12 +213,16 @@ void FormWidgetsController::slotButtonClicked(QAbstractButton *button)
void FormWidgetsController::slotFormButtonsChangedByUndoRedo(int pageNumber, const QList<Okular::FormFieldButton *> &formButtons)
{
QList<int> extraPages;
for (const Okular::FormFieldButton *formButton : formButtons) {
int id = formButton->id();
QAbstractButton *button = m_buttons[id];
CheckBoxEdit *check = qobject_cast<CheckBoxEdit *>(button);
if (check) {
int itemPageNumber = -1;
if (CheckBoxEdit *check = qobject_cast<CheckBoxEdit *>(button)) {
itemPageNumber = check->pageItem()->pageNumber();
Q_EMIT refreshFormWidget(check->formField());
} else if (RadioButtonEdit *radio = qobject_cast<RadioButtonEdit *>(button)) {
itemPageNumber = radio->pageItem()->pageNumber();
}
// temporarily disable exclusiveness of the button group
// since it breaks doing/redoing steps into which all the checkboxes
@ -228,8 +233,14 @@ void FormWidgetsController::slotFormButtonsChangedByUndoRedo(int pageNumber, con
button->setChecked(checked);
button->group()->setExclusive(wasExclusive);
button->setFocus();
if (itemPageNumber != -1 && itemPageNumber != pageNumber) {
extraPages << itemPageNumber;
}
}
Q_EMIT changed(pageNumber);
for (auto page : extraPages) {
Q_EMIT changed(page);
}
}
Okular::Document *FormWidgetsController::document() const