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 977 of file kkeysequencewidget.cpp.

978{
979 switch (seq.count()) {
980 case 0:
981 return QKeySequence(keyQt);
982 case 1:
983 return QKeySequence(seq[0], keyQt);
984 case 2:
985 return QKeySequence(seq[0], seq[1], keyQt);
986 case 3:
987 return QKeySequence(seq[0], seq[1], seq[2], keyQt);
988 default:
989 return seq;
990 }
991}

◆ 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 414 of file kkeysequencewidget.cpp.

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

References keySequence.

◆ conflictWithLocalShortcuts()

bool KisKKeySequenceWidgetPrivate::conflictWithLocalShortcuts ( const QKeySequence & seq)

Conflicts the key sequence seq with a current local shortcut?

Definition at line 447 of file kkeysequencewidget.cpp.

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

520{
522 return false;
523 }
524 KStandardShortcut::StandardShortcut ssc = KStandardShortcut::find(keySequence);
525 if (ssc != KStandardShortcut::AccelNone && !stealStandardShortcut(ssc, keySequence)) {
526 return true;
527 }
528 return false;
529}
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 390 of file kkeysequencewidget.cpp.

391{
392 modifierlessTimeout.stop();
393 isRecording = false;
394 keyButton->releaseKeyboard();
395 keyButton->setDown(false);
396 stealActions.clear();
397
399 // The sequence hasn't changed
401 return;
402 }
403
404 if (validate && !q->isKeySequenceAvailable(keySequence)) {
405 // The sequence had conflicts and the user said no to stealing it
407 } else {
409 }
410
412}
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 clearButton->setIcon(KisIconUtils::loadIcon(QStringLiteral("edit-clear")));
234}
QIcon loadIcon(const QString &name)

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

◆ isOkWhenModifierless()

bool KisKKeySequenceWidgetPrivate::isOkWhenModifierless ( int keyQt)
static

Definition at line 994 of file kkeysequencewidget.cpp.

995{
996 //this whole function is a hack, but especially the first line of code
997 if (QKeySequence(keyQt).toString().length() == 1) {
998 return false;
999 }
1000
1001 switch (keyQt) {
1002 case Qt::Key_Return:
1003 case Qt::Key_Space:
1004 case Qt::Key_Tab:
1005 case Qt::Key_Backtab: //does this ever happen?
1006 case Qt::Key_Backspace:
1007 case Qt::Key_Delete:
1008 return false;
1009 default:
1010 return true;
1011 }
1012}
qreal length(const QPointF &vec)
Definition Ellipse.cc:82
QString toString(const QString &value)

References length().

◆ startRecording()

void KisKKeySequenceWidgetPrivate::startRecording ( )

Definition at line 373 of file kkeysequencewidget.cpp.

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

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 531 of file kkeysequencewidget.cpp.

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

References q.

◆ updateShortcutDisplay()

void KisKKeySequenceWidgetPrivate::updateShortcutDisplay ( )

Definition at line 545 of file kkeysequencewidget.cpp.

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

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: