QShortcutMap: Rename variables to clarify their use
The state machinery of QShortcutMap is complicated enough as it is, so let's use better variable names. In particular, let's distinguish the registered shortcuts (QShortcutEntries), from the candidate QKeySequence sequences that we compute based on the incoming events. Task-number: QTBUG-116873 Change-Id: I9bd59097e786ecfb9d241c2eb7b871a4bba9b44f Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
parent
2496882ea7
commit
709c93083e
@ -29,23 +29,23 @@ Q_LOGGING_CATEGORY(lcShortcutMap, "qt.gui.shortcutmap")
|
||||
struct QShortcutEntry
|
||||
{
|
||||
QShortcutEntry()
|
||||
: keyseq(0), context(Qt::WindowShortcut), enabled(false), autorepeat(1), id(0), owner(nullptr), contextMatcher(nullptr)
|
||||
: keySequence(0), context(Qt::WindowShortcut), enabled(false), autorepeat(1), id(0), owner(nullptr), contextMatcher(nullptr)
|
||||
{}
|
||||
|
||||
QShortcutEntry(const QKeySequence &k)
|
||||
: keyseq(k), context(Qt::WindowShortcut), enabled(false), autorepeat(1), id(0), owner(nullptr), contextMatcher(nullptr)
|
||||
: keySequence(k), context(Qt::WindowShortcut), enabled(false), autorepeat(1), id(0), owner(nullptr), contextMatcher(nullptr)
|
||||
{}
|
||||
|
||||
QShortcutEntry(QObject *o, const QKeySequence &k, Qt::ShortcutContext c, int i, bool a, QShortcutMap::ContextMatcher m)
|
||||
: keyseq(k), context(c), enabled(true), autorepeat(a), id(i), owner(o), contextMatcher(m)
|
||||
: keySequence(k), context(c), enabled(true), autorepeat(a), id(i), owner(o), contextMatcher(m)
|
||||
{}
|
||||
|
||||
bool correctContext() const { return contextMatcher(owner, context); }
|
||||
|
||||
bool operator<(const QShortcutEntry &f) const
|
||||
{ return keyseq < f.keyseq; }
|
||||
{ return keySequence < f.keySequence; }
|
||||
|
||||
QKeySequence keyseq;
|
||||
QKeySequence keySequence;
|
||||
Qt::ShortcutContext context;
|
||||
bool enabled : 1;
|
||||
bool autorepeat : 1;
|
||||
@ -88,7 +88,7 @@ public:
|
||||
}
|
||||
QShortcutMap *q_ptr; // Private's parent
|
||||
|
||||
QList<QShortcutEntry> sequences; // All sequences!
|
||||
QList<QShortcutEntry> shortcuts; // All shortcuts!
|
||||
|
||||
int currentId; // Global shortcut ID number
|
||||
int ambigCount; // Index of last enabled ambiguous dispatch
|
||||
@ -120,18 +120,18 @@ QShortcutMap::~QShortcutMap()
|
||||
Adds a shortcut to the global map.
|
||||
Returns the id of the newly added shortcut.
|
||||
*/
|
||||
int QShortcutMap::addShortcut(QObject *owner, const QKeySequence &key, Qt::ShortcutContext context, ContextMatcher matcher)
|
||||
int QShortcutMap::addShortcut(QObject *owner, const QKeySequence &keySequence, Qt::ShortcutContext context, ContextMatcher matcher)
|
||||
{
|
||||
Q_ASSERT_X(owner, "QShortcutMap::addShortcut", "All shortcuts need an owner");
|
||||
Q_ASSERT_X(!key.isEmpty(), "QShortcutMap::addShortcut", "Cannot add keyless shortcuts to map");
|
||||
Q_ASSERT_X(!keySequence.isEmpty(), "QShortcutMap::addShortcut", "Cannot add keyless shortcuts to map");
|
||||
Q_D(QShortcutMap);
|
||||
|
||||
QShortcutEntry newEntry(owner, key, context, --(d->currentId), true, matcher);
|
||||
const auto it = std::upper_bound(d->sequences.begin(), d->sequences.end(), newEntry);
|
||||
d->sequences.insert(it, newEntry); // Insert sorted
|
||||
QShortcutEntry newEntry(owner, keySequence, context, --(d->currentId), true, matcher);
|
||||
const auto it = std::upper_bound(d->shortcuts.begin(), d->shortcuts.end(), newEntry);
|
||||
d->shortcuts.insert(it, newEntry); // Insert sorted
|
||||
qCDebug(lcShortcutMap).nospace()
|
||||
<< "QShortcutMap::addShortcut(" << owner << ", "
|
||||
<< key << ", " << context << ") added shortcut with ID " << d->currentId;
|
||||
<< keySequence << ", " << context << ") added shortcut with ID " << d->currentId;
|
||||
return d->currentId;
|
||||
}
|
||||
|
||||
@ -144,36 +144,36 @@ int QShortcutMap::addShortcut(QObject *owner, const QKeySequence &key, Qt::Short
|
||||
Returns the number of sequences removed from the map.
|
||||
*/
|
||||
|
||||
int QShortcutMap::removeShortcut(int id, QObject *owner, const QKeySequence &key)
|
||||
int QShortcutMap::removeShortcut(int id, QObject *owner, const QKeySequence &keySequence)
|
||||
{
|
||||
Q_D(QShortcutMap);
|
||||
int itemsRemoved = 0;
|
||||
bool allOwners = (owner == nullptr);
|
||||
bool allKeys = key.isEmpty();
|
||||
bool allKeys = keySequence.isEmpty();
|
||||
bool allIds = id == 0;
|
||||
|
||||
auto debug = qScopeGuard([&](){
|
||||
qCDebug(lcShortcutMap).nospace()
|
||||
<< "QShortcutMap::removeShortcut(" << id << ", " << owner << ", "
|
||||
<< key << ") removed " << itemsRemoved << " shortcuts(s)";
|
||||
<< keySequence << ") removed " << itemsRemoved << " shortcuts(s)";
|
||||
});
|
||||
|
||||
// Special case, remove everything
|
||||
if (allOwners && allKeys && allIds) {
|
||||
itemsRemoved = d->sequences.size();
|
||||
d->sequences.clear();
|
||||
itemsRemoved = d->shortcuts.size();
|
||||
d->shortcuts.clear();
|
||||
return itemsRemoved;
|
||||
}
|
||||
|
||||
int i = d->sequences.size()-1;
|
||||
int i = d->shortcuts.size()-1;
|
||||
while (i>=0)
|
||||
{
|
||||
const QShortcutEntry &entry = d->sequences.at(i);
|
||||
const QShortcutEntry &entry = d->shortcuts.at(i);
|
||||
int entryId = entry.id;
|
||||
if ((allOwners || entry.owner == owner)
|
||||
&& (allIds || entry.id == id)
|
||||
&& (allKeys || entry.keyseq == key)) {
|
||||
d->sequences.removeAt(i);
|
||||
&& (allKeys || entry.keySequence == keySequence)) {
|
||||
d->shortcuts.removeAt(i);
|
||||
++itemsRemoved;
|
||||
}
|
||||
if (id == entryId)
|
||||
@ -191,22 +191,22 @@ int QShortcutMap::removeShortcut(int id, QObject *owner, const QKeySequence &key
|
||||
are changed.
|
||||
Returns the number of sequences which are matched in the map.
|
||||
*/
|
||||
int QShortcutMap::setShortcutEnabled(bool enable, int id, QObject *owner, const QKeySequence &key)
|
||||
int QShortcutMap::setShortcutEnabled(bool enable, int id, QObject *owner, const QKeySequence &keySequence)
|
||||
{
|
||||
Q_D(QShortcutMap);
|
||||
int itemsChanged = 0;
|
||||
bool allOwners = (owner == nullptr);
|
||||
bool allKeys = key.isEmpty();
|
||||
bool allKeys = keySequence.isEmpty();
|
||||
bool allIds = id == 0;
|
||||
|
||||
int i = d->sequences.size()-1;
|
||||
int i = d->shortcuts.size()-1;
|
||||
while (i>=0)
|
||||
{
|
||||
QShortcutEntry entry = d->sequences.at(i);
|
||||
QShortcutEntry entry = d->shortcuts.at(i);
|
||||
if ((allOwners || entry.owner == owner)
|
||||
&& (allIds || entry.id == id)
|
||||
&& (allKeys || entry.keyseq == key)) {
|
||||
d->sequences[i].enabled = enable;
|
||||
&& (allKeys || entry.keySequence == keySequence)) {
|
||||
d->shortcuts[i].enabled = enable;
|
||||
++itemsChanged;
|
||||
}
|
||||
if (id == entry.id)
|
||||
@ -215,7 +215,7 @@ int QShortcutMap::setShortcutEnabled(bool enable, int id, QObject *owner, const
|
||||
}
|
||||
qCDebug(lcShortcutMap).nospace()
|
||||
<< "QShortcutMap::setShortcutEnabled(" << enable << ", " << id << ", "
|
||||
<< owner << ", " << key << ") = " << itemsChanged;
|
||||
<< owner << ", " << keySequence << ") = " << itemsChanged;
|
||||
return itemsChanged;
|
||||
}
|
||||
|
||||
@ -227,22 +227,22 @@ int QShortcutMap::setShortcutEnabled(bool enable, int id, QObject *owner, const
|
||||
are changed.
|
||||
Returns the number of sequences which are matched in the map.
|
||||
*/
|
||||
int QShortcutMap::setShortcutAutoRepeat(bool on, int id, QObject *owner, const QKeySequence &key)
|
||||
int QShortcutMap::setShortcutAutoRepeat(bool on, int id, QObject *owner, const QKeySequence &keySequence)
|
||||
{
|
||||
Q_D(QShortcutMap);
|
||||
int itemsChanged = 0;
|
||||
bool allOwners = (owner == nullptr);
|
||||
bool allKeys = key.isEmpty();
|
||||
bool allKeys = keySequence.isEmpty();
|
||||
bool allIds = id == 0;
|
||||
|
||||
int i = d->sequences.size()-1;
|
||||
int i = d->shortcuts.size()-1;
|
||||
while (i>=0)
|
||||
{
|
||||
QShortcutEntry entry = d->sequences.at(i);
|
||||
QShortcutEntry entry = d->shortcuts.at(i);
|
||||
if ((allOwners || entry.owner == owner)
|
||||
&& (allIds || entry.id == id)
|
||||
&& (allKeys || entry.keyseq == key)) {
|
||||
d->sequences[i].autorepeat = on;
|
||||
&& (allKeys || entry.keySequence == keySequence)) {
|
||||
d->shortcuts[i].autorepeat = on;
|
||||
++itemsChanged;
|
||||
}
|
||||
if (id == entry.id)
|
||||
@ -251,7 +251,7 @@ int QShortcutMap::setShortcutAutoRepeat(bool on, int id, QObject *owner, const Q
|
||||
}
|
||||
qCDebug(lcShortcutMap).nospace()
|
||||
<< "QShortcutMap::setShortcutAutoRepeat(" << on << ", " << id << ", "
|
||||
<< owner << ", " << key << ") = " << itemsChanged;
|
||||
<< owner << ", " << keySequence << ") = " << itemsChanged;
|
||||
return itemsChanged;
|
||||
}
|
||||
|
||||
@ -365,11 +365,12 @@ bool QShortcutMap::hasShortcutForKeySequence(const QKeySequence &seq) const
|
||||
{
|
||||
Q_D(const QShortcutMap);
|
||||
QShortcutEntry entry(seq); // needed for searching
|
||||
const auto itEnd = d->sequences.cend();
|
||||
auto it = std::lower_bound(d->sequences.cbegin(), itEnd, entry);
|
||||
const auto itEnd = d->shortcuts.cend();
|
||||
auto it = std::lower_bound(d->shortcuts.cbegin(), itEnd, entry);
|
||||
|
||||
for (;it != itEnd; ++it) {
|
||||
if (matches(entry.keyseq, (*it).keyseq) == QKeySequence::ExactMatch && (*it).correctContext() && (*it).enabled) {
|
||||
if (matches(entry.keySequence, (*it).keySequence) == QKeySequence::ExactMatch
|
||||
&& (*it).correctContext() && (*it).enabled) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -388,7 +389,7 @@ bool QShortcutMap::hasShortcutForKeySequence(const QKeySequence &seq) const
|
||||
QKeySequence::SequenceMatch QShortcutMap::find(QKeyEvent *e, int ignoredModifiers)
|
||||
{
|
||||
Q_D(QShortcutMap);
|
||||
if (!d->sequences.size())
|
||||
if (!d->shortcuts.size())
|
||||
return QKeySequence::NoMatch;
|
||||
|
||||
createNewSequences(e, d->newEntries, ignoredModifiers);
|
||||
@ -410,15 +411,15 @@ QKeySequence::SequenceMatch QShortcutMap::find(QKeyEvent *e, int ignoredModifier
|
||||
QKeySequence::SequenceMatch result = QKeySequence::NoMatch;
|
||||
for (int i = d->newEntries.size()-1; i >= 0 ; --i) {
|
||||
QShortcutEntry entry(d->newEntries.at(i)); // needed for searching
|
||||
qCDebug(lcShortcutMap) << "Looking for shortcuts matching" << entry.keyseq;
|
||||
qCDebug(lcShortcutMap) << "Looking for shortcuts matching" << entry.keySequence;
|
||||
|
||||
QKeySequence::SequenceMatch bestMatchForEntry = QKeySequence::NoMatch;
|
||||
|
||||
const auto itEnd = d->sequences.constEnd();
|
||||
auto it = std::lower_bound(d->sequences.constBegin(), itEnd, entry);
|
||||
const auto itEnd = d->shortcuts.constEnd();
|
||||
auto it = std::lower_bound(d->shortcuts.constBegin(), itEnd, entry);
|
||||
for (; it != itEnd; ++it) {
|
||||
QKeySequence::SequenceMatch match = matches(entry.keyseq, (*it).keyseq);
|
||||
qCDebug(lcShortcutMap) << " -" << match << "for shortcut" << it->keyseq;
|
||||
QKeySequence::SequenceMatch match = matches(entry.keySequence, (*it).keySequence);
|
||||
qCDebug(lcShortcutMap) << " -" << match << "for shortcut" << it->keySequence;
|
||||
|
||||
// If we got a valid match, there might still be more keys to check against,
|
||||
// but if we get no match, we know that there are no more possible matches.
|
||||
@ -595,7 +596,7 @@ void QShortcutMap::dispatchEvent(QKeyEvent *e)
|
||||
if (!d->identicals.size())
|
||||
return;
|
||||
|
||||
const QKeySequence &curKey = d->identicals.at(0)->keyseq;
|
||||
const QKeySequence &curKey = d->identicals.at(0)->keySequence;
|
||||
if (d->prevSequence != curKey) {
|
||||
d->ambigCount = 0;
|
||||
d->prevSequence = curKey;
|
||||
@ -626,15 +627,15 @@ void QShortcutMap::dispatchEvent(QKeyEvent *e)
|
||||
if (ambiguousShortcuts.size() > 1) {
|
||||
qCDebug(lcShortcutMap) << "The following shortcuts are about to be activated ambiguously:";
|
||||
for (const QShortcutEntry *entry : std::as_const(ambiguousShortcuts))
|
||||
qCDebug(lcShortcutMap).nospace() << "- " << entry->keyseq << " (belonging to " << entry->owner << ")";
|
||||
qCDebug(lcShortcutMap).nospace() << "- " << entry->keySequence << " (belonging to " << entry->owner << ")";
|
||||
}
|
||||
|
||||
qCDebug(lcShortcutMap).nospace()
|
||||
<< "QShortcutMap::dispatchEvent(): Sending QShortcutEvent(\""
|
||||
<< next->keyseq.toString() << "\", " << next->id << ", "
|
||||
<< next->keySequence.toString() << "\", " << next->id << ", "
|
||||
<< static_cast<bool>(enabledShortcuts>1) << ") to object(" << next->owner << ')';
|
||||
}
|
||||
QShortcutEvent se(next->keyseq, next->id, enabledShortcuts>1);
|
||||
QShortcutEvent se(next->keySequence, next->id, enabledShortcuts > 1);
|
||||
QCoreApplication::sendEvent(const_cast<QObject *>(next->owner), &se);
|
||||
}
|
||||
|
||||
@ -642,7 +643,7 @@ QList<QKeySequence> QShortcutMap::keySequences(bool getAll) const
|
||||
{
|
||||
Q_D(const QShortcutMap);
|
||||
QList<QKeySequence> keys;
|
||||
for (auto sequence : d->sequences) {
|
||||
for (auto sequence : d->shortcuts) {
|
||||
bool addSequence = false;
|
||||
if (sequence.enabled) {
|
||||
if (getAll || sequence.context == Qt::ApplicationShortcut ||
|
||||
@ -671,7 +672,7 @@ QList<QKeySequence> QShortcutMap::keySequences(bool getAll) const
|
||||
}
|
||||
}
|
||||
if (addSequence)
|
||||
keys << sequence.keyseq;
|
||||
keys << sequence.keySequence;
|
||||
}
|
||||
}
|
||||
return keys;
|
||||
@ -686,8 +687,8 @@ QList<QKeySequence> QShortcutMap::keySequences(bool getAll) const
|
||||
void QShortcutMap::dumpMap() const
|
||||
{
|
||||
Q_D(const QShortcutMap);
|
||||
for (int i = 0; i < d->sequences.size(); ++i)
|
||||
qDebug().nospace() << &(d->sequences.at(i));
|
||||
for (int i = 0; i < d->shortcuts.size(); ++i)
|
||||
qDebug().nospace() << &(d->shortcuts.at(i));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user