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."));
289 return !(hasConflict);
343 QSet<KisKActionCollection *> changedCollections;
354 if (collection->
actions().contains(stealAction)) {
355 parentCollection = collection;
361 if (parentCollection) {
362 changedCollections.insert(parentCollection);
382 if (!QWidget::keyboardGrabber()) {
383 qWarning() <<
"Failed to grab the keyboard! Most likely qt's nograb option is active";
429 if (needle.isEmpty() || needle.toString(QKeySequence::NativeText).isEmpty()) {
433 foreach (
const QKeySequence &sequence, shortcuts) {
434 if (sequence.isEmpty()) {
438 if (sequence.matches(needle) != QKeySequence::NoMatch
439 || needle.matches(sequence) != QKeySequence::NoMatch) {
463 allActions += collection->
actions();
486 foreach (QAction *qaction, allActions) {
491 conflictingActions.append(qaction);
499 if (conflictingActions.isEmpty()) {
524 KStandardShortcut::StandardShortcut ssc = KStandardShortcut::find(
keySequence);
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));
539 if (KMessageBox::warningContinueCancel(
q, message, title, KGuiItem(i18n(
"Reassign"))) != KMessageBox::Continue) {
548 QString s =
keySequence.toString(QKeySequence::NativeText);
549 s.replace(QLatin1Char(
'&'), QStringLiteral(
"&&"));
554 s.append(QLatin1Char(
','));
557 s += QKeySequence(Qt::MetaModifier).toString(QKeySequence::NativeText);
561 s += QKeySequence(Qt::AltModifier).toString(QKeySequence::NativeText);
564 s += QKeySequence(Qt::ControlModifier).toString(QKeySequence::NativeText);
568 s += QKeySequence(Qt::ControlModifier).toString(QKeySequence::NativeText);
571 s += QKeySequence(Qt::AltModifier).toString(QKeySequence::NativeText);
575 s += QKeySequence(Qt::ShiftModifier).toString(QKeySequence::NativeText);
578 s += QKeySequence(Qt::KeypadModifier).toString(QKeySequence::NativeText);
581 }
else if (
nKey == 0) {
582 s = i18nc(
"What the user inputs now will be taken as the new shortcut",
"Input");
585 s.append(QStringLiteral(
" ..."));
589 s = i18nc(
"No shortcut defined",
"None");
592 s.prepend(QLatin1Char(
' '));
593 s.append(QLatin1Char(
' '));
614 if (
d->
isRecording && e->type() == QEvent::ShortcutOverride) {
619 if (
d->
isRecording && e->type() == QEvent::ContextMenu) {
625 return QPushButton::event(e);
631static bool isShiftAsModifierAllowed(
int keyQt)
634 keyQt &= ~Qt::KeyboardModifierMask;
640 if (keyQt >= Qt::Key_F1 && keyQt <= Qt::Key_F35) {
644 if (QChar::isLetter(keyQt)) {
651 case Qt::Key_Backspace:
653 case Qt::Key_Backtab:
656 case Qt::Key_ScrollLock:
659 case Qt::Key_PageDown:
670 case Qt::Key_CapsLock:
671 case Qt::Key_NumLock:
674 case Qt::Key_Forward:
676 case Qt::Key_Refresh:
677 case Qt::Key_Favorites:
678 case Qt::Key_LaunchMedia:
679 case Qt::Key_OpenUrl:
680 case Qt::Key_HomePage:
682 case Qt::Key_VolumeDown:
683 case Qt::Key_VolumeMute:
684 case Qt::Key_VolumeUp:
685 case Qt::Key_BassBoost:
687 case Qt::Key_BassDown:
688 case Qt::Key_TrebleUp:
689 case Qt::Key_TrebleDown:
690 case Qt::Key_MediaPlay:
691 case Qt::Key_MediaStop:
692 case Qt::Key_MediaPrevious:
693 case Qt::Key_MediaNext:
694 case Qt::Key_MediaRecord:
695 case Qt::Key_MediaPause:
696 case Qt::Key_MediaTogglePlayPause:
697 case Qt::Key_LaunchMail:
698 case Qt::Key_Calculator:
700 case Qt::Key_ToDoList:
701 case Qt::Key_Calendar:
702 case Qt::Key_PowerDown:
703 case Qt::Key_ContrastAdjust:
704 case Qt::Key_Standby:
705 case Qt::Key_MonBrightnessUp:
706 case Qt::Key_MonBrightnessDown:
707 case Qt::Key_KeyboardLightOnOff:
708 case Qt::Key_KeyboardBrightnessUp:
709 case Qt::Key_KeyboardBrightnessDown:
710 case Qt::Key_PowerOff:
713 case Qt::Key_ScreenSaver:
716 case Qt::Key_LightBulb:
718 case Qt::Key_History:
719 case Qt::Key_AddFavorite:
720 case Qt::Key_HotLinks:
721 case Qt::Key_BrightnessAdjust:
722 case Qt::Key_Finance:
723 case Qt::Key_Community:
724 case Qt::Key_AudioRewind:
725 case Qt::Key_BackForward:
726 case Qt::Key_ApplicationLeft:
727 case Qt::Key_ApplicationRight:
731 case Qt::Key_ClearGrab:
735 case Qt::Key_Display:
737 case Qt::Key_Documents:
739 case Qt::Key_Explorer:
745 case Qt::Key_Meeting:
748 case Qt::Key_MySites:
750 case Qt::Key_OfficeHome:
756 case Qt::Key_RotateWindows:
757 case Qt::Key_RotationPB:
758 case Qt::Key_RotationKB:
762 case Qt::Key_SplitScreen:
763 case Qt::Key_Support:
764 case Qt::Key_TaskPane:
765 case Qt::Key_Terminal:
772 case Qt::Key_ZoomOut:
774 case Qt::Key_Messenger:
776 case Qt::Key_MailForward:
777 case Qt::Key_Pictures:
779 case Qt::Key_Battery:
780 case Qt::Key_Bluetooth:
783 case Qt::Key_AudioForward:
784 case Qt::Key_AudioRepeat:
785 case Qt::Key_AudioRandomPlay:
786 case Qt::Key_Subtitle:
787 case Qt::Key_AudioCycleTrack:
791 case Qt::Key_TopMenu:
792 case Qt::Key_Suspend:
793 case Qt::Key_Hibernate:
794 case Qt::Key_Launch0:
795 case Qt::Key_Launch1:
796 case Qt::Key_Launch2:
797 case Qt::Key_Launch3:
798 case Qt::Key_Launch4:
799 case Qt::Key_Launch5:
800 case Qt::Key_Launch6:
801 case Qt::Key_Launch7:
802 case Qt::Key_Launch8:
803 case Qt::Key_Launch9:
804 case Qt::Key_LaunchA:
805 case Qt::Key_LaunchB:
806 case Qt::Key_LaunchC:
807 case Qt::Key_LaunchD:
808 case Qt::Key_LaunchE:
809 case Qt::Key_LaunchF:
811 case Qt::Key_Control:
814 case Qt::Key_Super_L:
815 case Qt::Key_Super_R:
827 int keyQt = e->key();
832 KMessageBox::error(
this,
833 i18n(
"The key you just pressed is not supported by Qt."),
834 i18n(
"Unsupported Key"));
838 uint newModifiers = e->modifiers() & (Qt::SHIFT | Qt::CTRL | Qt::ALT | Qt::META);
842 if (!
d->
isRecording && ((keyQt == Qt::Key_Return || keyQt == Qt::Key_Space))) {
851 return QPushButton::keyPressEvent(e);
861 case Qt::Key_Control:
864 case Qt::Key_Super_L:
865 case Qt::Key_Super_R:
895#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
896 const QList<int> vec = QKeyMapper::possibleKeys(e);
901 if (!vec.isEmpty() && e->modifiers() != Qt::NoModifier) {
907 }
else if ((keyQt == Qt::Key_Backtab) && (
d->
modifierKeys & Qt::SHIFT)) {
909 }
else if (isShiftAsModifierAllowed(keyQt)) {
935 if (e->key() == -1) {
941 return QPushButton::keyReleaseEvent(e);
946 uint newModifiers = e->modifiers() & (Qt::SHIFT | Qt::CTRL | Qt::ALT | Qt::META);
953 newModifiers &= ~Qt::SHIFT;
955 case Qt::Key_Control:
956 newModifiers &= ~Qt::CTRL;
960 newModifiers &= ~Qt::ALT;
963 newModifiers &= ~Qt::META;
979 switch (seq.count()) {
981 return QKeySequence(keyQt);
983 return QKeySequence(seq[0], keyQt);
985 return QKeySequence(seq[0], seq[1], keyQt);
987 return QKeySequence(seq[0], seq[1], seq[2], keyQt);
997 if (QKeySequence(keyQt).toString().
length() == 1) {
1002 case Qt::Key_Return:
1005 case Qt::Key_Backtab:
1006 case Qt::Key_Backspace:
1007 case Qt::Key_Delete:
1014#include "moc_kkeysequencewidget.cpp"
1015#include "moc_kkeysequencewidget_p.cpp"
qreal length(const QPointF &vec)
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)