12#include "keysequencevalidator.h"
14#include <KLocalizedString>
15#include <KStandardShortcut>
17#include <config-kdeclarative.h>
19#include <KGlobalAccel>
20#include <KGlobalShortcutInfo>
23KeySequenceValidator::KeySequenceValidator(
QObject *parent)
28QKeySequence KeySequenceValidator::currentKeySequence()
const
30 return m_currentKeySequence;
33void KeySequenceValidator::setCurrentKeySequence(
const QKeySequence &sequence)
35 if (m_currentKeySequence == sequence) {
39 m_currentKeySequence = sequence;
40 Q_EMIT currentKeySequenceChanged();
43KeySequenceEnums::ShortcutTypes KeySequenceValidator::validateTypes()
const
45 return m_validateTypes;
48void KeySequenceValidator::setValidateTypes(KeySequenceEnums::ShortcutTypes types)
50 if (m_validateTypes == types) {
54 m_validateTypes = types;
55 Q_EMIT validateTypesChanged();
58void KeySequenceValidator::validateSequence(
const QKeySequence &keySequence)
60 ValidationResult result = ValidationResult::Accept;
61 if (m_validateTypes & KeySequenceEnums::GlobalShortcuts) {
62 result = validateGlobalShortcut(keySequence);
65 if (result == ValidationResult::Reject) {
66 Q_EMIT finished(m_currentKeySequence);
70 if (result == ValidationResult::QuestionPending) {
74 if (m_validateTypes & KeySequenceEnums::StandardShortcuts) {
75 result = validateStandardShortcut(keySequence);
78 if (result == ValidationResult::Reject) {
79 Q_EMIT finished(m_currentKeySequence);
80 }
else if (result == ValidationResult::Accept) {
81 Q_EMIT finished(keySequence);
85void KeySequenceValidator::accept()
88 m_pendingKeySequence = QKeySequence{};
90 ValidationResult result = ValidationResult::Accept;
91 if (m_validateGlobalPending) {
92 m_validateGlobalPending =
false;
93 if (m_validateTypes & KeySequenceEnums::StandardShortcuts) {
94 result = validateStandardShortcut(keySequence);
98 if (result == ValidationResult::Reject) {
99 Q_EMIT finished(m_currentKeySequence);
100 }
else if (result == ValidationResult::Accept) {
102 if (m_validateTypes & KeySequenceEnums::GlobalShortcuts) {
106 Q_EMIT finished(keySequence);
110void KeySequenceValidator::reject()
112 m_pendingKeySequence = QKeySequence{};
113 Q_EMIT finished(m_currentKeySequence);
116KeySequenceValidator::ValidationResult KeySequenceValidator::validateGlobalShortcut(
const QKeySequence &keySequence)
120 if (
keySequence.toString().contains(QLatin1String(
"F12"))) {
121 QString title =
i18n(
"Reserved Shortcut");
122 QString message =
i18n(
123 "The F12 key is reserved on Windows, so cannot be used for a global shortcut.\n"
124 "Please choose another one.");
126 Q_EMIT error(title, message);
127 return ValidationResult::Reject;
129 return ValidationResult::Accept;
131#elif HAVE_KGLOBALACCEL
133 QList<KGlobalShortcutInfo> others;
134 QList<KGlobalShortcutInfo> shadow;
135 QList<KGlobalShortcutInfo> shadowed;
145 QString title =
i18n(
"Global Shortcut Shadowing");
148 message +=
i18n(
"The '%1' key combination is shadowed by following global actions:\n").
arg(
keySequence.toString());
149 for (
const KGlobalShortcutInfo &info : std::as_const(shadowed)) {
150 message +=
i18n(
"Action '%1' in context '%2'\n").
arg(info.friendlyName(), info.contextFriendlyName());
154 message +=
i18n(
"The '%1' key combination shadows following global actions:\n").
arg(
keySequence.toString());
155 for (
const KGlobalShortcutInfo &info : std::as_const(shadow)) {
156 message +=
i18n(
"Action '%1' in context '%2'\n").
arg(info.friendlyName(), info.contextFriendlyName());
160 Q_EMIT error(title, message);
161 return ValidationResult::Reject;
165 QString title =
i18nc(
"@dialog:title",
"Found Conflict");
168 if (others.
size() == 1) {
169 auto info = others.
at(0);
170 message =
i18n(
"Shortcut '%1' is already assigned to action '%2' of %3.\nDo you want to reassign it?",
173 info.componentFriendlyName());
175 message =
i18n(
"Shortcut '%1' is already assigned to the following actions:\n");
176 for (
const auto &info : std::as_const(others)) {
177 message +=
i18n(
"Action '%1' of %2\n", info.friendlyName(), info.componentFriendlyName());
179 message +=
i18n(
"Do you want to reassign it?");
183 m_validateGlobalPending =
true;
184 Q_EMIT question(title, message);
185 return ValidationResult::QuestionPending;
188 return ValidationResult::Accept;
191KeySequenceValidator::ValidationResult KeySequenceValidator::validateStandardShortcut(
const QKeySequence &keySequence)
194 if (ssc != KStandardShortcut::AccelNone) {
195 QString title =
i18n(
"Conflict with Standard Application Shortcut");
196 QString message =
i18n(
197 "The '%1' key combination is also used for the standard action "
198 "\"%2\" that some applications use.\n"
199 "Do you really want to use it as a global shortcut as well?",
204 Q_EMIT question(title, message);
205 return ValidationResult::QuestionPending;
207 return ValidationResult::Accept;
211#include "moc_keysequencevalidator.cpp"
static QList< KGlobalShortcutInfo > globalShortcutsByKey(const QKeySequence &seq, MatchType type=Equal)
static void stealShortcutSystemwide(const QKeySequence &seq)
static bool isGlobalShortcutAvailable(const QKeySequence &seq, const QString &component=QString())
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
const QList< QKeySequence > & find()
QString label(StandardShortcut id)
const_reference at(qsizetype i) const const
bool isEmpty() const const
qsizetype size() const const
QString arg(Args &&... args) const const
void keySequence(QWidget *widget, const QKeySequence &keySequence)