Skip to content

Commit

Permalink
Fix browser-like DbTab experience on macOS and Windows
Browse files Browse the repository at this point in the history
* macOS and Windows browsers do not use `Alt+#` to change tabs. Windows uses `Ctrl` and macOS uses `Command`. Linux uses `Alt`.
* Remove shortcut for `Key+0` and assign `Key+9` as last tab selection
* Streamline tab selection code in MainWindow
  • Loading branch information
humanoid authored and droidmonkey committed Feb 9, 2020
1 parent f62e053 commit 61d9722
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 41 deletions.
76 changes: 37 additions & 39 deletions src/gui/MainWindow.cpp
Expand Up @@ -302,26 +302,31 @@ MainWindow::MainWindow()
new QShortcut(Qt::CTRL + Qt::Key_PageDown, this, SLOT(selectNextDatabaseTab()));
new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_Tab, this, SLOT(selectPreviousDatabaseTab()));
new QShortcut(Qt::CTRL + Qt::Key_PageUp, this, SLOT(selectPreviousDatabaseTab()));
new QShortcut(Qt::ALT + Qt::Key_0, this, SLOT(selectLastDatabaseTab()));

auto shortcut = new QShortcut(Qt::ALT + Qt::Key_1, this);
// Tab selection by number, Windows uses Ctrl, macOS uses Command,
// ans Linux uses Alt to emulate a browser-like experience
auto dbTabModifier = Qt::CTRL;
#ifdef Q_OS_LINUX
dbTabModifier = Qt::ALT;
#endif
auto shortcut = new QShortcut(dbTabModifier + Qt::Key_1, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(0); });
shortcut = new QShortcut(dbTabModifier + Qt::Key_2, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(1); });
shortcut = new QShortcut(Qt::ALT + Qt::Key_2, this);
shortcut = new QShortcut(dbTabModifier + Qt::Key_3, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(2); });
shortcut = new QShortcut(Qt::ALT + Qt::Key_3, this);
shortcut = new QShortcut(dbTabModifier + Qt::Key_4, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(3); });
shortcut = new QShortcut(Qt::ALT + Qt::Key_4, this);
shortcut = new QShortcut(dbTabModifier + Qt::Key_5, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(4); });
shortcut = new QShortcut(Qt::ALT + Qt::Key_5, this);
shortcut = new QShortcut(dbTabModifier + Qt::Key_6, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(5); });
shortcut = new QShortcut(Qt::ALT + Qt::Key_6, this);
shortcut = new QShortcut(dbTabModifier + Qt::Key_7, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(6); });
shortcut = new QShortcut(Qt::ALT + Qt::Key_7, this);
shortcut = new QShortcut(dbTabModifier + Qt::Key_8, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(7); });
shortcut = new QShortcut(Qt::ALT + Qt::Key_8, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(8); });
shortcut = new QShortcut(Qt::ALT + Qt::Key_9, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(9); });
shortcut = new QShortcut(dbTabModifier + Qt::Key_9, this);
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(m_ui->tabWidget->count() - 1); });

// Toggle password and username visibility in entry view
new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_C, this, SLOT(togglePasswordsHidden()));
Expand Down Expand Up @@ -974,45 +979,38 @@ void MainWindow::databaseStatusChanged(DatabaseWidget* dbWidget)
updateTrayIcon();
}

void MainWindow::selectNextDatabaseTab()
/**
* Select a database tab by its index. Stays bounded to first/last tab
* on overflow unless wrap is true.
*
* @param tabIndex 0-based tab index selector
* @param wrap if true wrap around to first/last tab
*/
void MainWindow::selectDatabaseTab(int tabIndex, bool wrap)
{
if (m_ui->stackedWidget->currentIndex() == DatabaseTabScreen) {
int index = m_ui->tabWidget->currentIndex() + 1;
if (index >= m_ui->tabWidget->count()) {
m_ui->tabWidget->setCurrentIndex(0);
if (wrap) {
if (tabIndex < 0) {
tabIndex = m_ui->tabWidget->count() - 1;
} else if (tabIndex >= m_ui->tabWidget->count()) {
tabIndex = 0;
}
} else {
m_ui->tabWidget->setCurrentIndex(index);
tabIndex = qBound(0, tabIndex, m_ui->tabWidget->count() - 1);
}
}
}

void MainWindow::selectPreviousDatabaseTab()
{
if (m_ui->stackedWidget->currentIndex() == DatabaseTabScreen) {
int index = m_ui->tabWidget->currentIndex() - 1;
if (index < 0) {
m_ui->tabWidget->setCurrentIndex(m_ui->tabWidget->count() - 1);
} else {
m_ui->tabWidget->setCurrentIndex(index);
}
m_ui->tabWidget->setCurrentIndex(tabIndex);
}
}

void MainWindow::selectDatabaseTab(int tabIndex)
void MainWindow::selectNextDatabaseTab()
{
if (m_ui->stackedWidget->currentIndex() == DatabaseTabScreen) {
if (tabIndex <= m_ui->tabWidget->count()) {
m_ui->tabWidget->setCurrentIndex(--tabIndex);
}
}
selectDatabaseTab(m_ui->tabWidget->currentIndex() + 1, true);
}

void MainWindow::selectLastDatabaseTab()
void MainWindow::selectPreviousDatabaseTab()
{
if (m_ui->stackedWidget->currentIndex() == DatabaseTabScreen) {
int index = m_ui->tabWidget->count() - 1;
m_ui->tabWidget->setCurrentIndex(index);
}
selectDatabaseTab(m_ui->tabWidget->currentIndex() - 1, true);
}

void MainWindow::databaseTabChanged(int tabIndex)
Expand Down
3 changes: 1 addition & 2 deletions src/gui/MainWindow.h
Expand Up @@ -122,8 +122,7 @@ private slots:
void showErrorMessage(const QString& message);
void selectNextDatabaseTab();
void selectPreviousDatabaseTab();
void selectDatabaseTab(int tabIndex);
void selectLastDatabaseTab();
void selectDatabaseTab(int tabIndex, bool wrap = false);
void togglePasswordsHidden();
void toggleUsernamesHidden();
void obtainContextFocusLock();
Expand Down

0 comments on commit 61d9722

Please sign in to comment.