diff options
Diffstat (limited to 'Swift/QtUI/QtTabbable.cpp')
-rw-r--r-- | Swift/QtUI/QtTabbable.cpp | 93 |
1 files changed, 53 insertions, 40 deletions
diff --git a/Swift/QtUI/QtTabbable.cpp b/Swift/QtUI/QtTabbable.cpp index 84a5100..df2cbfe 100644 --- a/Swift/QtUI/QtTabbable.cpp +++ b/Swift/QtUI/QtTabbable.cpp @@ -1,60 +1,73 @@ /* - * Copyright (c) 2010 Kevin Smith - * Licensed under the GNU General Public License v3. - * See Documentation/Licenses/GPLv3.txt for more information. + * Copyright (c) 2010-2016 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. */ -#include "QtTabbable.h" +#include <Swift/QtUI/QtTabbable.h> #include <QApplication> +#include <QKeyEvent> +#include <QShortcut> -#include "QtChatTabs.h" +#include <Swiften/Base/Platform.h> + +#include <Swift/QtUI/QtChatTabs.h> +#include <Swift/QtUI/QtUtilities.h> namespace Swift { +QtTabbable::QtTabbable() : QWidget() { + +} + QtTabbable::~QtTabbable() { - emit windowClosing(); + } bool QtTabbable::isWidgetSelected() { - /*isActiveWindow() shouldn't be necessary, but I don't trust it as far as I can throw it*/ - if (!isActiveWindow()) { - return false; - } - QtChatTabs* parent = qobject_cast<QtChatTabs*>(window()); - return parent ? parent->getCurrentTab() == this : isAncestorOf(QApplication::focusWidget()); + /*isActiveWindow() shouldn't be necessary, but I don't trust it as far as I can throw it*/ + if (!isActiveWindow()) { + return false; + } + QtChatTabs* parent = qobject_cast<QtChatTabs*>(window()); + return parent ? parent->getCurrentTab() == this : isAncestorOf(QApplication::focusWidget()); } -void QtTabbable::keyPressEvent(QKeyEvent *event) { - handleKeyPressEvent(event); +bool QtTabbable::event(QEvent* event) { + QKeyEvent* keyEvent = dynamic_cast<QKeyEvent*>(event); + if (keyEvent) { + // According to Qt's focus documentation, one can only override CTRL+TAB via reimplementing QWidget::event(). + if (keyEvent->modifiers().testFlag(QtUtilities::ctrlHardwareKeyModifier) && keyEvent->key() == Qt::Key_Tab) { + // Only handle KeyRelease event as Linux also generate KeyPress event in case of CTRL+TAB being pressed + // in the roster of a MUC. + if (keyEvent->type() == QEvent::KeyRelease) { + emit requestNextTab(); + } + return true; + } +#ifdef SWIFTEN_PLATFORM_LINUX + else if (keyEvent->modifiers().testFlag(QtUtilities::ctrlHardwareKeyModifier) && keyEvent->key() == Qt::Key_Backtab && keyEvent->type() != QEvent::KeyRelease) { +#else + else if (keyEvent->modifiers().testFlag(QtUtilities::ctrlHardwareKeyModifier) && keyEvent->key() == Qt::Key_Backtab) { +#endif +#ifdef SWIFTEN_PLATFORM_WINDOWS + // Windows emits both the KeyPress and KeyRelease events. + if (keyEvent->type() == QEvent::KeyPress) { +#else + if (keyEvent->type() != QEvent::ShortcutOverride) { +#endif + emit requestPreviousTab(); + } + return true; + } + } + return QWidget::event(event); } -void QtTabbable::handleKeyPressEvent(QKeyEvent *event) { - event->ignore(); - int key = event->key(); - Qt::KeyboardModifiers modifiers = event->modifiers(); - if (key == Qt::Key_W && modifiers == Qt::ControlModifier) { - close(); - event->accept(); - } else if ( - (key == Qt::Key_PageUp && modifiers == Qt::ControlModifier) -// || (key == Qt::Key_Left && modifiers == (Qt::ControlModifier & Qt::ShiftModifier)) - ) { - emit requestPreviousTab(); - event->accept(); - } else if ( - (key == Qt::Key_PageDown && modifiers == Qt::ControlModifier) -// || (key == Qt::Key_Right && modifiers == (Qt::ControlModifier & Qt::ShiftModifier) - || (key == Qt::Key_Tab && modifiers == Qt::ControlModifier) - ) { - emit requestNextTab(); - event->accept(); - } else if ( - (key == Qt::Key_A && modifiers == Qt::AltModifier) - ) { - emit requestActiveTab(); - event->accept(); - } +void QtTabbable::closeEvent(QCloseEvent* event) { + emit windowClosing(); + event->accept(); } } |