Allow different text for undo actions and items in QUndoView
Now the texts used for undo actions and for items in QUndoView can be set separately. This introduces an extended format of text that can be passed to QUndoCommand::setText or QUndoCommand constructor. The action text can now contain two strings separated by a "\n". The first string (that goes before "\n") is then returned by QUndoCommand::text() and used as name of item in QUndoView. The second string (that goes after "\n") is returned by QUndoCommand::actionText() and used when the text properties of the undo and redo actions are updated. If the text passed to QUndoCommand does not contain "\n", everything works as before, and both QUndoCommand::text() and QUndoCommand::actionText() return the same string. Even though action text in English usually does not need different forms for undo actions and QUndoView item, translators can employ this new command text format, for example to adjust the grammatical case used in command text to match the context of "Undo %1"/"Redo %1". Merge-request: 2610 Reviewed-by: ossi (cherry picked from commit 9b784789c75d59b27530bbf1d12676cc44f64f46)
This commit is contained in:
parent
ec4d346f95
commit
342d2a253c
@ -114,7 +114,7 @@ QUndoCommand::QUndoCommand(const QString &text, QUndoCommand *parent)
|
||||
d = new QUndoCommandPrivate;
|
||||
if (parent != 0)
|
||||
parent->d->child_list.append(this);
|
||||
d->text = text;
|
||||
setText(text);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -230,10 +230,9 @@ void QUndoCommand::undo()
|
||||
Returns a short text string describing what this command does; for example,
|
||||
"insert text".
|
||||
|
||||
The text is used when the text properties of the stack's undo and redo
|
||||
actions are updated.
|
||||
The text is used for names of items in QUndoView.
|
||||
|
||||
\sa setText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()
|
||||
\sa actionText(), setText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()
|
||||
*/
|
||||
|
||||
QString QUndoCommand::text() const
|
||||
@ -241,18 +240,48 @@ QString QUndoCommand::text() const
|
||||
return d->text;
|
||||
}
|
||||
|
||||
/*!
|
||||
\since 4.8
|
||||
|
||||
Returns a short text string describing what this command does; for example,
|
||||
"insert text".
|
||||
|
||||
The text is used when the text properties of the stack's undo and redo
|
||||
actions are updated.
|
||||
|
||||
\sa text(), setText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()
|
||||
*/
|
||||
|
||||
QString QUndoCommand::actionText() const
|
||||
{
|
||||
return d->actionText;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the command's text to be the \a text specified.
|
||||
|
||||
The specified text should be a short user-readable string describing what this
|
||||
command does.
|
||||
|
||||
\sa text() QUndoStack::createUndoAction() QUndoStack::createRedoAction()
|
||||
If you need to have two different strings for text() and actionText(), separate
|
||||
them with "\n" and pass into this function. Even if you do not use this feature
|
||||
for English strings during development, you can still let translators use two
|
||||
different strings in order to match specific languages' needs.
|
||||
The described feature and the function actionText() are available since Qt 4.8.
|
||||
|
||||
\sa text() actionText() QUndoStack::createUndoAction() QUndoStack::createRedoAction()
|
||||
*/
|
||||
|
||||
void QUndoCommand::setText(const QString &text)
|
||||
{
|
||||
d->text = text;
|
||||
int cdpos = text.indexOf(QLatin1Char('\n'));
|
||||
if (cdpos > 0) {
|
||||
d->text = text.left(cdpos);
|
||||
d->actionText = text.mid(cdpos + 1);
|
||||
} else {
|
||||
d->text = text;
|
||||
d->actionText = text;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -796,7 +825,7 @@ bool QUndoStack::canRedo() const
|
||||
/*!
|
||||
Returns the text of the command which will be undone in the next call to undo().
|
||||
|
||||
\sa QUndoCommand::text() redoText()
|
||||
\sa QUndoCommand::actionText() redoText()
|
||||
*/
|
||||
|
||||
QString QUndoStack::undoText() const
|
||||
@ -805,14 +834,14 @@ QString QUndoStack::undoText() const
|
||||
if (!d->macro_stack.isEmpty())
|
||||
return QString();
|
||||
if (d->index > 0)
|
||||
return d->command_list.at(d->index - 1)->text();
|
||||
return d->command_list.at(d->index - 1)->actionText();
|
||||
return QString();
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the text of the command which will be redone in the next call to redo().
|
||||
|
||||
\sa QUndoCommand::text() undoText()
|
||||
\sa QUndoCommand::actionText() undoText()
|
||||
*/
|
||||
|
||||
QString QUndoStack::redoText() const
|
||||
@ -821,7 +850,7 @@ QString QUndoStack::redoText() const
|
||||
if (!d->macro_stack.isEmpty())
|
||||
return QString();
|
||||
if (d->index < d->command_list.size())
|
||||
return d->command_list.at(d->index)->text();
|
||||
return d->command_list.at(d->index)->actionText();
|
||||
return QString();
|
||||
}
|
||||
|
||||
|
@ -70,6 +70,7 @@ public:
|
||||
virtual void redo();
|
||||
|
||||
QString text() const;
|
||||
QString actionText() const;
|
||||
void setText(const QString &text);
|
||||
|
||||
virtual int id() const;
|
||||
|
@ -70,6 +70,7 @@ public:
|
||||
QUndoCommandPrivate() : id(-1) {}
|
||||
QList<QUndoCommand*> child_list;
|
||||
QString text;
|
||||
QString actionText;
|
||||
int id;
|
||||
};
|
||||
|
||||
|
@ -101,6 +101,16 @@ private:
|
||||
QString m_text;
|
||||
};
|
||||
|
||||
class IdleCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
IdleCommand(QUndoCommand *parent = 0);
|
||||
~IdleCommand();
|
||||
|
||||
virtual void undo();
|
||||
virtual void redo();
|
||||
};
|
||||
|
||||
InsertCommand::InsertCommand(QString *str, int idx, const QString &text,
|
||||
QUndoCommand *parent)
|
||||
: QUndoCommand(parent)
|
||||
@ -201,6 +211,26 @@ bool AppendCommand::mergeWith(const QUndoCommand *other)
|
||||
return true;
|
||||
}
|
||||
|
||||
IdleCommand::IdleCommand(QUndoCommand *parent)
|
||||
: QUndoCommand(parent)
|
||||
{
|
||||
// "idle-item" goes to QUndoStack::{redo,undo}Text
|
||||
// "idle-action" goes to all other places (e.g. QUndoView)
|
||||
setText("idle-item\nidle-action");
|
||||
}
|
||||
|
||||
IdleCommand::~IdleCommand()
|
||||
{
|
||||
}
|
||||
|
||||
void IdleCommand::redo()
|
||||
{
|
||||
}
|
||||
|
||||
void IdleCommand::undo()
|
||||
{
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
** tst_QUndoStack
|
||||
*/
|
||||
@ -221,6 +251,7 @@ private slots:
|
||||
void compression();
|
||||
void undoLimit();
|
||||
void commandTextFormat();
|
||||
void separateUndoText();
|
||||
};
|
||||
|
||||
tst_QUndoStack::tst_QUndoStack()
|
||||
@ -2970,6 +3001,34 @@ void tst_QUndoStack::commandTextFormat()
|
||||
qApp->removeTranslator(&translator);
|
||||
}
|
||||
|
||||
void tst_QUndoStack::separateUndoText()
|
||||
{
|
||||
QUndoStack stack;
|
||||
QAction *undo_action = stack.createUndoAction(0);
|
||||
QAction *redo_action = stack.createRedoAction(0);
|
||||
|
||||
QUndoCommand *command1 = new IdleCommand();
|
||||
QUndoCommand *command2 = new IdleCommand();
|
||||
stack.push(command1);
|
||||
stack.push(command2);
|
||||
stack.undo();
|
||||
|
||||
QCOMPARE(undo_action->text(), QString("Undo idle-action"));
|
||||
QCOMPARE(redo_action->text(), QString("Redo idle-action"));
|
||||
QCOMPARE(command1->actionText(), QString("idle-action"));
|
||||
|
||||
QCOMPARE(command1->text(), QString("idle-item"));
|
||||
QCOMPARE(stack.text(0), QString("idle-item"));
|
||||
|
||||
command1->setText("idle");
|
||||
QCOMPARE(command1->actionText(), QString("idle"));
|
||||
QCOMPARE(command1->text(), QString("idle"));
|
||||
|
||||
command1->setText("idle-item\nidle-action");
|
||||
QCOMPARE(command1->actionText(), QString("idle-action"));
|
||||
QCOMPARE(command1->text(), QString("idle-item"));
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QUndoStack)
|
||||
|
||||
#include "tst_qundostack.moc"
|
||||
|
Loading…
Reference in New Issue
Block a user