Krita Source Code Documentation
Loading...
Searching...
No Matches
KisKKeySequenceWidgetPrivate Class Reference

Public Member Functions

void cancelRecording ()
 
bool checkAgainstGlobalShortcuts () const
 
bool checkAgainstLocalShortcuts () const
 
bool checkAgainstStandardShortcuts () const
 
bool conflictWithGlobalShortcuts (const QKeySequence &seq)
 
bool conflictWithLocalShortcuts (const QKeySequence &seq)
 
bool conflictWithStandardShortcuts (const QKeySequence &seq)
 
void controlModifierlessTimeout ()
 
void doneRecording (bool validate=true)
 
void init ()
 
 KisKKeySequenceWidgetPrivate (KisKKeySequenceWidget *q)
 
void startRecording ()
 
bool stealShortcuts (const QList< QAction * > &actions, const QKeySequence &seq)
 
bool stealStandardShortcut (KStandardShortcut::StandardShortcut std, const QKeySequence &seq)
 
void updateShortcutDisplay ()
 
void wontStealShortcut (QAction *item, const QKeySequence &seq)
 

Static Public Member Functions

static QKeySequence appendToSequence (const QKeySequence &seq, int keyQt)
 
static bool isOkWhenModifierless (int keyQt)
 

Public Attributes

bool allowModifierless
 
QList< KisKActionCollection * > checkActionCollections
 
KisKKeySequenceWidget::ShortcutTypes checkAgainstShortcutTypes
 Check the key sequence against KStandardShortcut::find()
 
QList< QAction * > checkList
 
QToolButton * clearButton
 
QString componentName
 
bool isRecording
 
KKeySequenceButtonkeyButton
 
QKeySequence keySequence
 
QHBoxLayout * layout
 
uint modifierKeys
 
QTimer modifierlessTimeout
 
bool multiKeyShortcutsAllowed
 
uint nKey
 
QKeySequence oldKeySequence
 
KisKKeySequenceWidget *const q
 
QList< QAction * > stealActions
 

Detailed Description

Definition at line 34 of file kkeysequencewidget.cpp.

Constructor & Destructor Documentation

◆ KisKKeySequenceWidgetPrivate()

KisKKeySequenceWidgetPrivate::KisKKeySequenceWidgetPrivate ( KisKKeySequenceWidget * q)

Definition at line 146 of file kkeysequencewidget.cpp.

147 : q(q)
148 , layout(0)
149 , keyButton(0)
150 , clearButton(0)
151 , allowModifierless(false)
152 , nKey(0)
153 , modifierKeys(0)
154 , isRecording(false)
156 , componentName()
158 , stealActions()
159{}
KisKKeySequenceWidget *const q
KisKKeySequenceWidget::ShortcutTypes checkAgainstShortcutTypes
Check the key sequence against KStandardShortcut::find()
@ GlobalShortcuts
Check against global shortcuts.
@ LocalShortcuts
Check with local shortcuts.

Member Function Documentation

◆ appendToSequence()

QKeySequence KisKKeySequenceWidgetPrivate::appendToSequence ( const QKeySequence & seq,
int keyQt )
static

Definition at line 961 of file kkeysequencewidget.cpp.

962{
963 switch (seq.count()) {
964 case 0:
965 return QKeySequence(keyQt);
966 case 1:
967 return QKeySequence(seq[0], keyQt);
968 case 2:
969 return QKeySequence(seq[0], seq[1], keyQt);
970 case 3:
971 return QKeySequence(seq[0], seq[1], seq[2], keyQt);
972 default:
973 return seq;
974 }
975}

◆ cancelRecording()

void KisKKeySequenceWidgetPrivate::cancelRecording ( )
inline

◆ checkAgainstGlobalShortcuts()

bool KisKKeySequenceWidgetPrivate::checkAgainstGlobalShortcuts ( ) const
inline

◆ checkAgainstLocalShortcuts()

bool KisKKeySequenceWidgetPrivate::checkAgainstLocalShortcuts ( ) const
inline

◆ checkAgainstStandardShortcuts()

bool KisKKeySequenceWidgetPrivate::checkAgainstStandardShortcuts ( ) const
inline

◆ conflictWithGlobalShortcuts()

bool KisKKeySequenceWidgetPrivate::conflictWithGlobalShortcuts ( const QKeySequence & seq)

Conflicts the key sequence seq conflict with Windows shortcut keys?

Definition at line 418 of file kkeysequencewidget.cpp.

419{
420 // This could hold some OS-specific stuff, or it could be linked back with
421 // the KDE global shortcut code at some point in the future.
422
423#ifdef Q_OS_WIN
424#else
425#endif
426 Q_UNUSED(keySequence);
427
428 return false;
429}

References keySequence.

◆ conflictWithLocalShortcuts()

bool KisKKeySequenceWidgetPrivate::conflictWithLocalShortcuts ( const QKeySequence & seq)

Conflicts the key sequence seq with a current local shortcut?

Definition at line 451 of file kkeysequencewidget.cpp.

452{
454 return false;
455 }
456
457 // We have actions both in the deprecated checkList and the
458 // checkActionCollections list. Add all the actions to a single list to
459 // be able to process them in a single loop below.
460 // Note that this can't be done in setCheckActionCollections(), because we
461 // keep pointers to the action collections, and between the call to
462 // setCheckActionCollections() and this function some actions might already be
463 // removed from the collection again.
464 QList<QAction *> allActions;
465 allActions += checkList;
466 foreach (KisKActionCollection *collection, checkActionCollections) {
467 allActions += collection->actions();
468 }
469
470 // Because of multikey shortcuts we can have clashes with many shortcuts.
471 //
472 // Example 1:
473 //
474 // Application currently uses 'CTRL-X,a', 'CTRL-X,f' and 'CTRL-X,CTRL-F'
475 // and the user wants to use 'CTRL-X'. 'CTRL-X' will only trigger as
476 // 'activatedAmbiguously()' for obvious reasons.
477 //
478 // Example 2:
479 //
480 // Application currently uses 'CTRL-X'. User wants to use 'CTRL-X,CTRL-F'.
481 // This will shadow 'CTRL-X' for the same reason as above.
482 //
483 // Example 3:
484 //
485 // Some weird combination of Example 1 and 2 with three shortcuts using
486 // 1/2/3 key shortcuts. I think you can imagine.
487 QList<QAction *> conflictingActions;
488
489 //find conflicting shortcuts with existing actions
490 foreach (QAction *qaction, allActions) {
491 if (shortcutsConflictWith(qaction->shortcuts(), keySequence)) {
492 // A conflict with a KAction. If that action is configurable
493 // ask the user what to do. If not reject this keySequence.
494 if (checkActionCollections.first()->isShortcutsConfigurable(qaction)) {
495 conflictingActions.append(qaction);
496 } else {
498 return true;
499 }
500 }
501 }
502
503 if (conflictingActions.isEmpty()) {
504 // No conflicting shortcuts found.
505 return false;
506 }
507
508 if (stealShortcuts(conflictingActions, keySequence)) {
509 stealActions = conflictingActions;
510
511 // Announce that the user agreed to override the other shortcut
512 Q_FOREACH (QAction *stealAction, stealActions) {
513 Q_EMIT q->stealShortcut(
515 stealAction);
516 }
517 return false;
518 } else {
519 return true;
520 }
521}
A container for a set of QAction objects.
QList< QAction * > actions() const
QList< KisKActionCollection * > checkActionCollections
bool stealShortcuts(const QList< QAction * > &actions, const QKeySequence &seq)
void wontStealShortcut(QAction *item, const QKeySequence &seq)
void stealShortcut(const QKeySequence &seq, QAction *action)
bool shortcutsConflictWith(const QList< QKeySequence > &shortcuts, const QKeySequence &needle)

References KisKActionCollection::actions(), checkActionCollections, checkAgainstShortcutTypes, checkList, keySequence, KisKKeySequenceWidget::LocalShortcuts, q, shortcutsConflictWith(), stealActions, KisKKeySequenceWidget::stealShortcut(), stealShortcuts(), and wontStealShortcut().

◆ conflictWithStandardShortcuts()

bool KisKKeySequenceWidgetPrivate::conflictWithStandardShortcuts ( const QKeySequence & seq)

Conflicts the key sequence seq with a current standard shortcut?

Pops up a dialog asking overriding the conflict is OK.

Definition at line 523 of file kkeysequencewidget.cpp.

524{
526 return false;
527 }
528 KStandardShortcut::StandardShortcut ssc = KStandardShortcut::find(keySequence);
529 if (ssc != KStandardShortcut::AccelNone && !stealStandardShortcut(ssc, keySequence)) {
530 return true;
531 }
532 return false;
533}
bool stealStandardShortcut(KStandardShortcut::StandardShortcut std, const QKeySequence &seq)

References checkAgainstShortcutTypes, keySequence, KisKKeySequenceWidget::StandardShortcuts, and stealStandardShortcut().

◆ controlModifierlessTimeout()

void KisKKeySequenceWidgetPrivate::controlModifierlessTimeout ( )
inline

Definition at line 86 of file kkeysequencewidget.cpp.

87 {
88 if (nKey != 0 && !modifierKeys) {
89 // No modifier key pressed currently. Start the timeout
90 modifierlessTimeout.start(600);
91 } else {
92 // A modifier is pressed. Stop the timeout
94 }
95
96 }

References modifierKeys, modifierlessTimeout, and nKey.

◆ doneRecording()

void KisKKeySequenceWidgetPrivate::doneRecording ( bool validate = true)

Definition at line 394 of file kkeysequencewidget.cpp.

395{
396 modifierlessTimeout.stop();
397 isRecording = false;
398 keyButton->releaseKeyboard();
399 keyButton->setDown(false);
400 stealActions.clear();
401
403 // The sequence hasn't changed
405 return;
406 }
407
408 if (validate && !q->isKeySequenceAvailable(keySequence)) {
409 // The sequence had conflicts and the user said no to stealing it
411 } else {
413 }
414
416}
void keySequenceChanged(const QKeySequence &seq)
bool isKeySequenceAvailable(const QKeySequence &seq) const

References KisKKeySequenceWidget::isKeySequenceAvailable(), isRecording, keyButton, keySequence, KisKKeySequenceWidget::keySequenceChanged(), modifierlessTimeout, oldKeySequence, q, stealActions, and updateShortcutDisplay().

◆ init()

void KisKKeySequenceWidgetPrivate::init ( )

Definition at line 219 of file kkeysequencewidget.cpp.

220{
221 layout = new QHBoxLayout(q);
222 layout->setContentsMargins(0, 0, 0, 0);
223
224 keyButton = new KKeySequenceButton(this, q);
225 keyButton->setFocusPolicy(Qt::StrongFocus);
226 keyButton->setIcon(KisIconUtils::loadIcon(QStringLiteral("configure")));
227 keyButton->setToolTip(i18n("Click on the button, then enter the shortcut like you would in the program.\nExample for Ctrl+A: hold the Ctrl key and press A."));
228 layout->addWidget(keyButton);
229
230 clearButton = new QToolButton(q);
231 layout->addWidget(clearButton);
232
233 if (qApp->isLeftToRight()) {
234 clearButton->setIcon(KisIconUtils::loadIcon(QStringLiteral("edit-clear-locationbar-rtl")));
235 } else {
236 clearButton->setIcon(KisIconUtils::loadIcon(QStringLiteral("edit-clear-locationbar-ltr")));
237 }
238}
QIcon loadIcon(const QString &name)

References clearButton, keyButton, layout, KisIconUtils::loadIcon(), and q.

◆ isOkWhenModifierless()

bool KisKKeySequenceWidgetPrivate::isOkWhenModifierless ( int keyQt)
static

Definition at line 978 of file kkeysequencewidget.cpp.

979{
980 //this whole function is a hack, but especially the first line of code
981 if (QKeySequence(keyQt).toString().length() == 1) {
982 return false;
983 }
984
985 switch (keyQt) {
986 case Qt::Key_Return:
987 case Qt::Key_Space:
988 case Qt::Key_Tab:
989 case Qt::Key_Backtab: //does this ever happen?
990 case Qt::Key_Backspace:
991 case Qt::Key_Delete:
992 return false;
993 default:
994 return true;
995 }
996}
qreal length(const QPointF &vec)
Definition Ellipse.cc:82
QString toString(const QString &value)

References length().

◆ startRecording()

void KisKKeySequenceWidgetPrivate::startRecording ( )

Definition at line 377 of file kkeysequencewidget.cpp.

378{
379 nKey = 0;
380 modifierKeys = 0;
382 keySequence = QKeySequence();
383 isRecording = true;
384 keyButton->grabKeyboard();
385
386 if (!QWidget::keyboardGrabber()) {
387 qWarning() << "Failed to grab the keyboard! Most likely qt's nograb option is active";
388 }
389
390 keyButton->setDown(true);
392}

References isRecording, keyButton, keySequence, modifierKeys, nKey, oldKeySequence, and updateShortcutDisplay().

◆ stealShortcuts()

bool KisKKeySequenceWidgetPrivate::stealShortcuts ( const QList< QAction * > & actions,
const QKeySequence & seq )

Definition at line 161 of file kkeysequencewidget.cpp.

164{
165
166 const int listSize = actions.size();
167
168 QString title = i18ncp("%1 is the number of conflicts", "Shortcut Conflict", "Shortcut Conflicts", listSize);
169
170 QString conflictingShortcuts;
171 Q_FOREACH (const QAction *action, actions) {
172 conflictingShortcuts += i18n("Shortcut '%1' for action '%2'\n",
173 action->shortcut().toString(QKeySequence::NativeText),
174 KLocalizedString::removeAcceleratorMarker(action->text()));
175 }
176 QString message = i18ncp("%1 is the number of ambiguous shortcut clashes (hidden)",
177 "The \"%2\" shortcut is ambiguous with the following shortcut.\n"
178 "Do you want to assign an empty shortcut to this action?\n"
179 "%3",
180 "The \"%2\" shortcut is ambiguous with the following shortcuts.\n"
181 "Do you want to assign an empty shortcut to these actions?\n"
182 "%3",
183 listSize,
184 seq.toString(QKeySequence::NativeText),
185 conflictingShortcuts);
186
187 if (KMessageBox::warningContinueCancel(q, message, title, KGuiItem(i18n("Reassign"))) != KMessageBox::Continue) {
188 return false;
189 }
190
191 return true;
192}

References q.

◆ stealStandardShortcut()

bool KisKKeySequenceWidgetPrivate::stealStandardShortcut ( KStandardShortcut::StandardShortcut std,
const QKeySequence & seq )

Get permission to steal the shortcut @seq from the standard shortcut std.

Definition at line 535 of file kkeysequencewidget.cpp.

536{
537 QString title = i18n("Conflict with Standard Application Shortcut");
538 QString message = i18n("The '%1' key combination is also used for the standard action "
539 "\"%2\" that some applications use.\n"
540 "Do you really want to use it as a global shortcut as well?",
541 seq.toString(QKeySequence::NativeText), KStandardShortcut::label(std));
542
543 if (KMessageBox::warningContinueCancel(q, message, title, KGuiItem(i18n("Reassign"))) != KMessageBox::Continue) {
544 return false;
545 }
546 return true;
547}

References q.

◆ updateShortcutDisplay()

void KisKKeySequenceWidgetPrivate::updateShortcutDisplay ( )

Definition at line 549 of file kkeysequencewidget.cpp.

550{
551 //empty string if no non-modifier was pressed
552 QString s = keySequence.toString(QKeySequence::NativeText);
553 s.replace(QLatin1Char('&'), QStringLiteral("&&"));
554
555 if (isRecording) {
556 if (modifierKeys) {
557 if (!s.isEmpty()) {
558 s.append(QLatin1Char(','));
559 }
560 if (modifierKeys & Qt::MetaModifier) {
561 s += QKeySequence(Qt::MetaModifier).toString(QKeySequence::NativeText);
562 }
563#if defined(Q_OS_MAC)
564 if (modifierKeys & Qt::AltModifier) {
565 s += QKeySequence(Qt::AltModifier).toString(QKeySequence::NativeText);
566 }
567 if (modifierKeys & Qt::ControlModifier) {
568 s += QKeySequence(Qt::ControlModifier).toString(QKeySequence::NativeText);
569 }
570#else
571 if (modifierKeys & Qt::ControlModifier) {
572 s += QKeySequence(Qt::ControlModifier).toString(QKeySequence::NativeText);
573 }
574 if (modifierKeys & Qt::AltModifier) {
575 s += QKeySequence(Qt::AltModifier).toString(QKeySequence::NativeText);
576 }
577#endif
578 if (modifierKeys & Qt::ShiftModifier) {
579 s += QKeySequence(Qt::ShiftModifier).toString(QKeySequence::NativeText);
580 }
581 if (modifierKeys & Qt::KeypadModifier) {
582 s += QKeySequence(Qt::KeypadModifier).toString(QKeySequence::NativeText);
583 }
584
585 } else if (nKey == 0) {
586 s = i18nc("What the user inputs now will be taken as the new shortcut", "Input");
587 }
588 //make it clear that input is still going on
589 s.append(QStringLiteral(" ..."));
590 }
591
592 if (s.isEmpty()) {
593 s = i18nc("No shortcut defined", "None");
594 }
595
596 s.prepend(QLatin1Char(' '));
597 s.append(QLatin1Char(' '));
598 keyButton->setText(s);
599
600}

References isRecording, keyButton, keySequence, modifierKeys, and nKey.

◆ wontStealShortcut()

void KisKKeySequenceWidgetPrivate::wontStealShortcut ( QAction * item,
const QKeySequence & seq )

Definition at line 194 of file kkeysequencewidget.cpp.

195{
196 QString title(i18n("Shortcut conflict"));
197 QString msg(i18n("<qt>The '%1' key combination is already used by the <b>%2</b> action.<br>"
198 "Please select a different one.</qt>", seq.toString(QKeySequence::NativeText),
199 KLocalizedString::removeAcceleratorMarker(item->text())));
200 KMessageBox::error(q, msg, title);
201}

References q.

Member Data Documentation

◆ allowModifierless

bool KisKKeySequenceWidgetPrivate::allowModifierless

Definition at line 116 of file kkeysequencewidget.cpp.

◆ checkActionCollections

QList<KisKActionCollection *> KisKKeySequenceWidgetPrivate::checkActionCollections

The list of action collections to check against for conflict shortcut

Definition at line 134 of file kkeysequencewidget.cpp.

◆ checkAgainstShortcutTypes

KisKKeySequenceWidget::ShortcutTypes KisKKeySequenceWidgetPrivate::checkAgainstShortcutTypes

Check the key sequence against KStandardShortcut::find()

Definition at line 124 of file kkeysequencewidget.cpp.

◆ checkList

QList<QAction *> KisKKeySequenceWidgetPrivate::checkList

The list of action to check against for conflict shortcut

Definition at line 129 of file kkeysequencewidget.cpp.

◆ clearButton

QToolButton* KisKKeySequenceWidgetPrivate::clearButton

Definition at line 111 of file kkeysequencewidget.cpp.

◆ componentName

QString KisKKeySequenceWidgetPrivate::componentName

Definition at line 121 of file kkeysequencewidget.cpp.

◆ isRecording

bool KisKKeySequenceWidgetPrivate::isRecording

Definition at line 119 of file kkeysequencewidget.cpp.

◆ keyButton

KKeySequenceButton* KisKKeySequenceWidgetPrivate::keyButton

Definition at line 110 of file kkeysequencewidget.cpp.

◆ keySequence

QKeySequence KisKKeySequenceWidgetPrivate::keySequence

Definition at line 113 of file kkeysequencewidget.cpp.

◆ layout

QHBoxLayout* KisKKeySequenceWidgetPrivate::layout

Definition at line 109 of file kkeysequencewidget.cpp.

◆ modifierKeys

uint KisKKeySequenceWidgetPrivate::modifierKeys

Definition at line 118 of file kkeysequencewidget.cpp.

◆ modifierlessTimeout

QTimer KisKKeySequenceWidgetPrivate::modifierlessTimeout

Definition at line 115 of file kkeysequencewidget.cpp.

◆ multiKeyShortcutsAllowed

bool KisKKeySequenceWidgetPrivate::multiKeyShortcutsAllowed

Definition at line 120 of file kkeysequencewidget.cpp.

◆ nKey

uint KisKKeySequenceWidgetPrivate::nKey

Definition at line 117 of file kkeysequencewidget.cpp.

◆ oldKeySequence

QKeySequence KisKKeySequenceWidgetPrivate::oldKeySequence

Definition at line 114 of file kkeysequencewidget.cpp.

◆ q

KisKKeySequenceWidget* const KisKKeySequenceWidgetPrivate::q

Definition at line 108 of file kkeysequencewidget.cpp.

◆ stealActions

QList<QAction *> KisKKeySequenceWidgetPrivate::stealActions

The action to steal the shortcut from.

Definition at line 139 of file kkeysequencewidget.cpp.


The documentation for this class was generated from the following file: