mirror of
https://invent.kde.org/graphics/okular
synced 2024-06-30 22:54:24 +00:00
Button groups can span multiple pages
The code needs to be aware of that. BUG: 479942
This commit is contained in:
parent
91de248ccb
commit
12e40e0d36
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user