11#include "config-xmlgui.h"
17#include <QApplication>
20#include <klocalizedstring.h>
21#include <kmessagebox.h>
26#include <QtGui/private/qkeymapper_p.h>
31 return qHash(seq.toString());
151 , allowModifierless(false)
155 , multiKeyShortcutsAllowed(true)
163 const QKeySequence &seq)
166 const int listSize = actions.size();
168 QString title = i18ncp(
"%1 is the number of conflicts",
"Shortcut Conflict",
"Shortcut Conflicts", listSize);
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()));
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"
180 "The \"%2\" shortcut is ambiguous with the following shortcuts.\n"
181 "Do you want to assign an empty shortcut to these actions?\n"
184 seq.toString(QKeySequence::NativeText),
185 conflictingShortcuts);
187 if (KMessageBox::warningContinueCancel(
q, message, title, KGuiItem(i18n(
"Reassign"))) != KMessageBox::Continue) {
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);
222 layout->setContentsMargins(0, 0, 0, 0);
225 keyButton->setFocusPolicy(Qt::StrongFocus);
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."));
233 if (qApp->isLeftToRight()) {
293 return !(hasConflict);
347 QSet<KisKActionCollection *> changedCollections;
358 if (collection->
actions().contains(stealAction)) {
359 parentCollection = collection;
365 if (parentCollection) {
366 changedCollections.insert(parentCollection);
386 if (!QWidget::keyboardGrabber()) {
387 qWarning() <<
"Failed to grab the keyboard! Most likely qt's nograb option is active";
433 if (needle.isEmpty() || needle.toString(QKeySequence::NativeText).isEmpty()) {
437 foreach (
const QKeySequence &sequence, shortcuts) {
438 if (sequence.isEmpty()) {
442 if (sequence.matches(needle) != QKeySequence::NoMatch
443 || needle.matches(sequence) != QKeySequence::NoMatch) {
467 allActions += collection->
actions();
490 foreach (QAction *qaction, allActions) {
495 conflictingActions.append(qaction);
503 if (conflictingActions.isEmpty()) {
528 KStandardShortcut::StandardShortcut ssc = KStandardShortcut::find(
keySequence);
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));
543 if (KMessageBox::warningContinueCancel(
q, message, title, KGuiItem(i18n(
"Reassign"))) != KMessageBox::Continue) {
552 QString s =
keySequence.toString(QKeySequence::NativeText);
553 s.replace(QLatin1Char(
'&'), QStringLiteral(
"&&"));
558 s.append(QLatin1Char(
','));
561 s += QKeySequence(Qt::MetaModifier).toString(QKeySequence::NativeText);
565 s += QKeySequence(Qt::AltModifier).toString(QKeySequence::NativeText);
568 s += QKeySequence(Qt::ControlModifier).toString(QKeySequence::NativeText);
572 s += QKeySequence(Qt::ControlModifier).toString(QKeySequence::NativeText);
575 s += QKeySequence(Qt::AltModifier).toString(QKeySequence::NativeText);
579 s += QKeySequence(Qt::ShiftModifier).toString(QKeySequence::NativeText);
582 s += QKeySequence(Qt::KeypadModifier).toString(QKeySequence::NativeText);
585 }
else if (
nKey == 0) {
586 s = i18nc(
"What the user inputs now will be taken as the new shortcut",
"Input");
589 s.append(QStringLiteral(
" ..."));
593 s = i18nc(
"No shortcut defined",
"None");
596 s.prepend(QLatin1Char(
' '));
597 s.append(QLatin1Char(
' '));
618 if (
d->
isRecording && e->type() == QEvent::ShortcutOverride) {
623 if (
d->
isRecording && e->type() == QEvent::ContextMenu) {
629 return QPushButton::event(e);
635static bool isShiftAsModifierAllowed(
int keyQt)
638 keyQt &= ~Qt::KeyboardModifierMask;
644 if (keyQt >= Qt::Key_F1 && keyQt <= Qt::Key_F35) {
648 if (QChar::isLetter(keyQt)) {
655 case Qt::Key_Backspace:
657 case Qt::Key_Backtab:
660 case Qt::Key_ScrollLock:
663 case Qt::Key_PageDown:
674 case Qt::Key_CapsLock:
675 case Qt::Key_NumLock:
678 case Qt::Key_Forward:
680 case Qt::Key_Refresh:
681 case Qt::Key_Favorites:
682 case Qt::Key_LaunchMedia:
683 case Qt::Key_OpenUrl:
684 case Qt::Key_HomePage:
686 case Qt::Key_VolumeDown:
687 case Qt::Key_VolumeMute:
688 case Qt::Key_VolumeUp:
689 case Qt::Key_BassBoost:
691 case Qt::Key_BassDown:
692 case Qt::Key_TrebleUp:
693 case Qt::Key_TrebleDown:
694 case Qt::Key_MediaPlay:
695 case Qt::Key_MediaStop:
696 case Qt::Key_MediaPrevious:
697 case Qt::Key_MediaNext:
698 case Qt::Key_MediaRecord:
699 case Qt::Key_MediaPause:
700 case Qt::Key_MediaTogglePlayPause:
701 case Qt::Key_LaunchMail:
702 case Qt::Key_Calculator:
704 case Qt::Key_ToDoList:
705 case Qt::Key_Calendar:
706 case Qt::Key_PowerDown:
707 case Qt::Key_ContrastAdjust:
708 case Qt::Key_Standby:
709 case Qt::Key_MonBrightnessUp:
710 case Qt::Key_MonBrightnessDown:
711 case Qt::Key_KeyboardLightOnOff:
712 case Qt::Key_KeyboardBrightnessUp:
713 case Qt::Key_KeyboardBrightnessDown:
714 case Qt::Key_PowerOff:
717 case Qt::Key_ScreenSaver:
720 case Qt::Key_LightBulb:
722 case Qt::Key_History:
723 case Qt::Key_AddFavorite:
724 case Qt::Key_HotLinks:
725 case Qt::Key_BrightnessAdjust:
726 case Qt::Key_Finance:
727 case Qt::Key_Community:
728 case Qt::Key_AudioRewind:
729 case Qt::Key_BackForward:
730 case Qt::Key_ApplicationLeft:
731 case Qt::Key_ApplicationRight:
735 case Qt::Key_ClearGrab:
739 case Qt::Key_Display:
741 case Qt::Key_Documents:
743 case Qt::Key_Explorer:
749 case Qt::Key_Meeting:
752 case Qt::Key_MySites:
754 case Qt::Key_OfficeHome:
760 case Qt::Key_RotateWindows:
761 case Qt::Key_RotationPB:
762 case Qt::Key_RotationKB:
766 case Qt::Key_SplitScreen:
767 case Qt::Key_Support:
768 case Qt::Key_TaskPane:
769 case Qt::Key_Terminal:
776 case Qt::Key_ZoomOut:
778 case Qt::Key_Messenger:
780 case Qt::Key_MailForward:
781 case Qt::Key_Pictures:
783 case Qt::Key_Battery:
784 case Qt::Key_Bluetooth:
787 case Qt::Key_AudioForward:
788 case Qt::Key_AudioRepeat:
789 case Qt::Key_AudioRandomPlay:
790 case Qt::Key_Subtitle:
791 case Qt::Key_AudioCycleTrack:
795 case Qt::Key_TopMenu:
796 case Qt::Key_Suspend:
797 case Qt::Key_Hibernate:
798 case Qt::Key_Launch0:
799 case Qt::Key_Launch1:
800 case Qt::Key_Launch2:
801 case Qt::Key_Launch3:
802 case Qt::Key_Launch4:
803 case Qt::Key_Launch5:
804 case Qt::Key_Launch6:
805 case Qt::Key_Launch7:
806 case Qt::Key_Launch8:
807 case Qt::Key_Launch9:
808 case Qt::Key_LaunchA:
809 case Qt::Key_LaunchB:
810 case Qt::Key_LaunchC:
811 case Qt::Key_LaunchD:
812 case Qt::Key_LaunchE:
813 case Qt::Key_LaunchF:
815 case Qt::Key_Control:
818 case Qt::Key_Super_L:
819 case Qt::Key_Super_R:
831 int keyQt = e->key();
836 KMessageBox::error(
this,
837 i18n(
"The key you just pressed is not supported by Qt."),
838 i18n(
"Unsupported Key"));
842 uint newModifiers = e->modifiers() & (Qt::SHIFT | Qt::CTRL | Qt::ALT | Qt::META);
846 if (!
d->
isRecording && ((keyQt == Qt::Key_Return || keyQt == Qt::Key_Space))) {
855 return QPushButton::keyPressEvent(e);
865 case Qt::Key_Control:
868 case Qt::Key_Super_L:
869 case Qt::Key_Super_R:
899#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
900 const QList<int> vec = QKeyMapper::possibleKeys(e);
905 if (!vec.isEmpty() && e->modifiers() != Qt::NoModifier) {
911 }
else if ((keyQt == Qt::Key_Backtab) && (
d->
modifierKeys & Qt::SHIFT)) {
913 }
else if (isShiftAsModifierAllowed(keyQt)) {
939 if (e->key() == -1) {
945 return QPushButton::keyReleaseEvent(e);
950 uint newModifiers = e->modifiers() & (Qt::SHIFT | Qt::CTRL | Qt::ALT | Qt::META);
963 switch (seq.count()) {
965 return QKeySequence(keyQt);
967 return QKeySequence(seq[0], keyQt);
969 return QKeySequence(seq[0], seq[1], keyQt);
971 return QKeySequence(seq[0], seq[1], seq[2], keyQt);
981 if (QKeySequence(keyQt).toString().
length() == 1) {
989 case Qt::Key_Backtab:
990 case Qt::Key_Backspace:
998#include "moc_kkeysequencewidget.cpp"
999#include "moc_kkeysequencewidget_p.cpp"
qreal length(const QPointF &vec)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
A container for a set of QAction objects.
void writeSettings(KConfigGroup *config=0, bool writeScheme=false, QAction *oneAction=0) const
QList< QAction * > actions() const
QIcon loadIcon(const QString &name)