diff options
author | Tobias Markmann <tm@ayena.de> | 2015-03-17 15:00:02 (GMT) |
---|---|---|
committer | Kevin Smith <kevin.smith@isode.com> | 2015-04-10 15:12:53 (GMT) |
commit | 6a2e6d58233cbf40b34f962f2b2f9b1589969e13 (patch) | |
tree | b0a62c32adc64fda30fc024f38acfb2a6da6351e /Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp | |
parent | b4e3ecf40ee5fda0ba46f714bd24a6d9f3a4cb5e (diff) | |
download | swift-6a2e6d58233cbf40b34f962f2b2f9b1589969e13.zip swift-6a2e6d58233cbf40b34f962f2b2f9b1589969e13.tar.bz2 |
Fix keyboard shortcuts for --no-tabs mode
This commit enables the following shortcuts for --no-tabs mode:
- CTRL + Tab or CTRL/CMD + PageDown to switch to the next chat window
- CTRL + Shift + Tab or CTRL/CMD + PageUp to switch to the previous chat window
- CTRL/CMD + W to close the current chat window
- ALT + A to switch to the next chat window with active messages
Test-Information:
Verified that the new shortcuts work as expected and verified that
standard mode and netbook mode still work as usual.
Change-Id: I3831b6c02f5d664cc8b21d7571e20aed00de89b4
Diffstat (limited to 'Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp')
-rw-r--r-- | Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp b/Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp new file mode 100644 index 0000000..7f44177 --- /dev/null +++ b/Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2015 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ + +#include <Swift/QtUI/QtChatTabsShortcutOnlySubstitute.h> + +#include <cassert> + +#include <QApplication> +#include <QShortcut> + +#include <Swiften/Base/Log.h> +#include <Swiften/Base/foreach.h> + +#include <Swift/QtUI/QtTabbable.h> + +namespace Swift { + +QtChatTabsShortcutOnlySubstitute::QtChatTabsShortcutOnlySubstitute() : QWidget() { + +} + +QtChatTabsShortcutOnlySubstitute::~QtChatTabsShortcutOnlySubstitute() { + +} + +void QtChatTabsShortcutOnlySubstitute::addTab(QtTabbable* tab) { + connect(tab, SIGNAL(requestNextTab()), this, SLOT(handleRequestedNextTab()), Qt::UniqueConnection); + connect(tab, SIGNAL(requestActiveTab()), this, SLOT(handleRequestedActiveTab()), Qt::UniqueConnection); + connect(tab, SIGNAL(requestPreviousTab()), this, SLOT(handleRequestedPreviousTab()), Qt::UniqueConnection); + + connect(new QShortcut(QKeySequence(tr("CTRL+W", "Close chat tab.")), tab), SIGNAL(activated()), this, SLOT(handleCloseTabShortcut())); + connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_PageUp), tab), SIGNAL(activated()), tab, SIGNAL(requestPreviousTab())); + connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_PageDown), tab), SIGNAL(activated()), tab, SIGNAL(requestNextTab())); + connect(new QShortcut(QKeySequence(Qt::ALT + Qt::Key_A), tab), SIGNAL(activated()), tab, SIGNAL(requestActiveTab())); +} + +void QtChatTabsShortcutOnlySubstitute::handleCloseTabShortcut() { + QtTabbable* senderTab = dynamic_cast<QtTabbable*>(sender()->parent()); + SWIFT_LOG_ASSERT(senderTab, debug) << "No window to close." << std::endl; + if (senderTab) { + senderTab->close(); + } +} + +void QtChatTabsShortcutOnlySubstitute::handleRequestedNextTab() { + QtTabbable* senderTab = dynamic_cast<QtTabbable*>(sender()); + + QList<QtTabbable*> tabs = tabbableWindows(); + + int currentIndex = tabs.indexOf(senderTab); + assert(currentIndex >= 0); + + QtTabbable* nextTab = tabs.at((currentIndex + 1) % tabs.size()); + nextTab->activateWindow(); +} + +void QtChatTabsShortcutOnlySubstitute::handleRequestedActiveTab() { + QtTabbable* senderTab = dynamic_cast<QtTabbable*>(sender()); + + QtTabbable::AlertType types[] = {QtTabbable::WaitingActivity, QtTabbable::ImpendingActivity}; + + QList<QtTabbable*> tabs = tabbableWindows(); + + for (int j = 0; j < 2; j++) { + int startIndex = tabs.indexOf(senderTab); + int currentIndex = startIndex; + + do { + currentIndex = (currentIndex + 1) % tabs.size(); + QtTabbable* currentTab = tabs.at(currentIndex); + if (currentTab->getWidgetAlertState() == types[j]) { + currentTab->activateWindow(); + return; + } + } while (startIndex != currentIndex); + } +} + +void QtChatTabsShortcutOnlySubstitute::handleRequestedPreviousTab() { + QtTabbable* senderTab = dynamic_cast<QtTabbable*>(sender()); + + QList<QtTabbable*> tabs = tabbableWindows(); + + int currentIndex = tabs.indexOf(senderTab); + assert(currentIndex >= 0); + + QtTabbable* previousTab = tabs.at((currentIndex + tabs.size() - 1) % tabs.size()); + previousTab->activateWindow(); +} + +QList<QtTabbable*> QtChatTabsShortcutOnlySubstitute::tabbableWindows() const { + QList<QWidget*> windows = qApp->topLevelWidgets(); + + QList<QtTabbable*> tabbables; + foreach(QWidget* topLevelWidget, windows) { + QtTabbable* tabbable = dynamic_cast<QtTabbable*>(topLevelWidget); + if (tabbable) { + tabbables << tabbable; + } + } + + return tabbables; +} + +} + |