ui: Keyboard controls (#935)

* switch focus between views with Tab
* move focus within views with WASD/HJKL/Arrows
* move focus between graph edges by holding Shift
* move focus between code references by holding Shift
* removed graph panning with WASD and moved zooming to Alt + W/S
* removed graph navigation by pressing starting character in graph view lists
* changed local reference and custom trail shortcuts
* updated Keyboard Shortcuts window
* use common back and forward shortcuts and YZ & Shift + YZ
* fix macOS issue where widgets don't get proper focus after creating a new tab
* don't use shared_ptr in QtMainView

fixes #486, #327, #214, #210
This commit is contained in:
Eberhard Gräther
2020-03-02 14:48:03 +01:00
committed by GitHub
parent f4b37f9763
commit b0616778f3
98 changed files with 4204 additions and 863 deletions
+151 -108
View File
@@ -78,6 +78,36 @@ void QtKeyboardShortcuts::windowReady()
setPreviousVisible(false);
}
QtKeyboardShortcuts::Shortcut::Shortcut(const QString& name, const QString& shortcut)
: name(name), shortcut(shortcut)
{
}
QtKeyboardShortcuts::Shortcut QtKeyboardShortcuts::Shortcut::defaultOrMac(
const QString& name, const QString& defaultShortcut, const QString& macShortcut)
{
#if defined(Q_OS_MAC)
return {name, macShortcut};
#else
return {name, defaultShortcut};
#endif
}
QtKeyboardShortcuts::Shortcut QtKeyboardShortcuts::Shortcut::winMacOrLinux(
const QString& name,
const QString& winShortcut,
const QString& macShortcut,
const QString& linuxShortcut)
{
#if defined(Q_OS_WIN32)
return {name, winShortcut};
#elif defined(Q_OS_MAC)
return {name, macShortcut};
#else
return {name, linuxShortcut};
#endif
}
QtShortcutTable* QtKeyboardShortcuts::createTableWidget(const std::string& objectName)
{
QtShortcutTable* table = new QtShortcutTable(this);
@@ -104,76 +134,81 @@ QtShortcutTable* QtKeyboardShortcuts::createTableWidget(const std::string& objec
return table;
}
void QtKeyboardShortcuts::addShortcuts(QtShortcutTable* table, const std::vector<Shortcut>& shortcuts) const
{
table->setRowCount(static_cast<int>(shortcuts.size()));
for (size_t i = 0; i < shortcuts.size(); ++i)
{
table->setItem(static_cast<int>(i), 0, new QTableWidgetItem(shortcuts[i].name));
table->setItem(static_cast<int>(i), 1, new QTableWidgetItem(shortcuts[i].shortcut));
}
table->updateSize();
}
QTableWidget* QtKeyboardShortcuts::createGenerelShortcutsTable()
{
QtShortcutTable* table = createTableWidget("table_general");
table->setRowCount(17);
table->setItem(0, 0, new QTableWidgetItem(QStringLiteral("Larger Font")));
table->setItem(1, 0, new QTableWidgetItem(QStringLiteral("Smaller Font")));
table->setItem(2, 0, new QTableWidgetItem(QStringLiteral("Reset Font Size")));
table->setItem(3, 0, new QTableWidgetItem(QStringLiteral("Back")));
table->setItem(4, 0, new QTableWidgetItem(QStringLiteral("Forward")));
table->setItem(5, 0, new QTableWidgetItem(QStringLiteral("Refresh")));
table->setItem(6, 0, new QTableWidgetItem(QStringLiteral("Full Refresh")));
table->setItem(7, 0, new QTableWidgetItem(QStringLiteral("Find Symbol")));
table->setItem(8, 0, new QTableWidgetItem(QStringLiteral("Find Text")));
table->setItem(9, 0, new QTableWidgetItem(QStringLiteral("Find On-Screen")));
table->setItem(10, 0, new QTableWidgetItem(QStringLiteral("New Project")));
table->setItem(11, 0, new QTableWidgetItem(QStringLiteral("Open Project")));
table->setItem(12, 0, new QTableWidgetItem(QStringLiteral("Close Window")));
table->setItem(13, 0, new QTableWidgetItem(QStringLiteral("Hide Window")));
table->setItem(14, 0, new QTableWidgetItem(QStringLiteral("To Overview")));
table->setItem(15, 0, new QTableWidgetItem(QStringLiteral("Preferences")));
table->setItem(16, 0, new QTableWidgetItem(QStringLiteral("Bookmark Active Symbol")));
table->setItem(17, 0, new QTableWidgetItem(QStringLiteral("Bookmark Manager")));
#if defined(Q_OS_MAC)
table->setItem(0, 1, new QTableWidgetItem("Cmd + +"));
table->setItem(1, 1, new QTableWidgetItem("Cmd + -"));
table->setItem(2, 1, new QTableWidgetItem("Cmd + 0"));
table->setItem(3, 1, new QTableWidgetItem("Cmd + Z | Backspace"));
table->setItem(4, 1, new QTableWidgetItem("Cmd + Shift + Z"));
table->setItem(5, 1, new QTableWidgetItem("Cmd + R"));
table->setItem(6, 1, new QTableWidgetItem("Cmd + Shift + R"));
table->setItem(7, 1, new QTableWidgetItem("Cmd + F"));
table->setItem(8, 1, new QTableWidgetItem("Cmd + Shift + F"));
table->setItem(9, 1, new QTableWidgetItem("Cmd + D | /"));
table->setItem(10, 1, new QTableWidgetItem("Cmd + N"));
table->setItem(11, 1, new QTableWidgetItem("Cmd + O"));
table->setItem(12, 1, new QTableWidgetItem("Cmd + W"));
table->setItem(13, 1, new QTableWidgetItem("Cmd + H"));
table->setItem(14, 1, new QTableWidgetItem("Cmd + Home | Cmd + Up"));
table->setItem(15, 1, new QTableWidgetItem("Cmd + ,"));
table->setItem(16, 1, new QTableWidgetItem("Cmd + S"));
table->setItem(17, 1, new QTableWidgetItem("Cmd + B"));
#else
table->setItem(0, 1, new QTableWidgetItem(QStringLiteral("Ctrl + +")));
table->setItem(1, 1, new QTableWidgetItem(QStringLiteral("Ctrl + -")));
table->setItem(2, 1, new QTableWidgetItem(QStringLiteral("Ctrl + 0")));
table->setItem(3, 1, new QTableWidgetItem(QStringLiteral("Ctrl + Z | Backspace")));
table->setItem(4, 1, new QTableWidgetItem(QStringLiteral("Ctrl + Shift + Z")));
table->setItem(5, 1, new QTableWidgetItem(QStringLiteral("F5")));
table->setItem(6, 1, new QTableWidgetItem(QStringLiteral("Shift + F5")));
table->setItem(7, 1, new QTableWidgetItem(QStringLiteral("Ctrl + F")));
table->setItem(8, 1, new QTableWidgetItem(QStringLiteral("Ctrl + Shift + F")));
table->setItem(9, 1, new QTableWidgetItem(QStringLiteral("Ctrl + D | /")));
table->setItem(10, 1, new QTableWidgetItem(QStringLiteral("Ctrl + N")));
table->setItem(11, 1, new QTableWidgetItem(QStringLiteral("Ctrl + O")));
# if defined(Q_OS_WIN32)
table->setItem(12, 1, new QTableWidgetItem("Alt + F4"));
# else
table->setItem(12, 1, new QTableWidgetItem(QStringLiteral("Ctrl + W")));
# endif
table->setItem(13, 1, new QTableWidgetItem(QLatin1String("")));
table->setItem(14, 1, new QTableWidgetItem(QStringLiteral("Ctrl + Home")));
table->setItem(15, 1, new QTableWidgetItem(QStringLiteral("Ctrl + ,")));
table->setItem(16, 1, new QTableWidgetItem(QStringLiteral("Ctrl + S")));
table->setItem(17, 1, new QTableWidgetItem(QStringLiteral("Ctrl + B")));
#endif
table->updateSize();
addShortcuts(
table,
{Shortcut(QStringLiteral("Switch Focus between Graph and Code"), QStringLiteral("Tab")),
Shortcut::defaultOrMac(
QStringLiteral("Larger Font"), QStringLiteral("Ctrl + +"), QStringLiteral("Cmd + +")),
Shortcut::defaultOrMac(
QStringLiteral("Smaller Font"), QStringLiteral("Ctrl + -"), QStringLiteral("Cmd + -")),
Shortcut::defaultOrMac(
QStringLiteral("Reset Font Size"), QStringLiteral("Ctrl + 0"), QStringLiteral("Cmd + 0")),
Shortcut::defaultOrMac(
QStringLiteral("Back"),
QStringLiteral("Alt + Left | Z | Y | Backspace"),
QStringLiteral("Cmd + [ | Z | Y | Backspace")),
Shortcut::defaultOrMac(
QStringLiteral("Forward"),
QStringLiteral("Alt + Right | Shift + Z | Shift + Y"),
QStringLiteral("Cmd + ] | Shift + Z | Shift + Y")),
Shortcut::defaultOrMac(
QStringLiteral("Refresh"), QStringLiteral("F5"), QStringLiteral("Cmd + R")),
Shortcut::defaultOrMac(
QStringLiteral("Full Refresh"),
QStringLiteral("Shift + F5"),
QStringLiteral("Cmd + Shift + R")),
Shortcut::defaultOrMac(
QStringLiteral("Find Symbol"), QStringLiteral("Ctrl + F"), QStringLiteral("Cmd + F")),
Shortcut::defaultOrMac(
QStringLiteral("Find Text"),
QStringLiteral("Ctrl + Shift + F"),
QStringLiteral("Cmd + Shift + F")),
Shortcut::defaultOrMac(
QStringLiteral("Find On-Screen"),
QStringLiteral("Ctrl + D | /"),
QStringLiteral("Cmd + D | /")),
Shortcut::defaultOrMac(
QStringLiteral("New Project"), QStringLiteral("Ctrl + N"), QStringLiteral("Cmd + N")),
Shortcut::defaultOrMac(
QStringLiteral("Open Project"), QStringLiteral("Ctrl + O"), QStringLiteral("Cmd + O")),
Shortcut::winMacOrLinux(
QStringLiteral("Close Window"),
QStringLiteral("Alt + F4"),
QStringLiteral("Cmd + W"),
QStringLiteral("Ctrl + W")),
Shortcut::defaultOrMac(
QStringLiteral("Hide Window"), QStringLiteral(""), QStringLiteral("Cmd + H")),
Shortcut::defaultOrMac(
QStringLiteral("To Overview"),
QStringLiteral("Ctrl + Home"),
QStringLiteral("Cmd + Home | Cmd + Up")),
Shortcut::defaultOrMac(
QStringLiteral("Preferences"), QStringLiteral("Ctrl + ,"), QStringLiteral("Cmd + ,")),
Shortcut::defaultOrMac(
QStringLiteral("Bookmark Active Symbol"),
QStringLiteral("Ctrl + S"),
QStringLiteral("Cmd + S")),
Shortcut::defaultOrMac(
QStringLiteral("Bookmark Manager"),
QStringLiteral("Ctrl + B"),
QStringLiteral("Cmd + B"))});
return table;
}
@@ -182,25 +217,31 @@ QTableWidget* QtKeyboardShortcuts::createCodeViewShortcutsTable()
{
QtShortcutTable* table = createTableWidget("table_code");
table->setRowCount(4);
table->setItem(0, 0, new QTableWidgetItem(QStringLiteral("Next Reference")));
table->setItem(1, 0, new QTableWidgetItem(QStringLiteral("Previous Reference")));
table->setItem(2, 0, new QTableWidgetItem(QStringLiteral("Next Local Reference")));
table->setItem(3, 0, new QTableWidgetItem(QStringLiteral("Previous Local Reference")));
#if defined(Q_OS_MAC)
table->setItem(0, 1, new QTableWidgetItem("Cmd + G"));
table->setItem(1, 1, new QTableWidgetItem("Cmd + Shift + G"));
table->setItem(2, 1, new QTableWidgetItem("Cmd + T"));
table->setItem(3, 1, new QTableWidgetItem("Cmd + Shift + T"));
#else
table->setItem(0, 1, new QTableWidgetItem(QStringLiteral("Ctrl + G")));
table->setItem(1, 1, new QTableWidgetItem(QStringLiteral("Ctrl + Shift + G")));
table->setItem(2, 1, new QTableWidgetItem(QStringLiteral("Ctrl + T")));
table->setItem(3, 1, new QTableWidgetItem(QStringLiteral("Ctrl + Shift + T")));
#endif
table->updateSize();
addShortcuts(
table,
{Shortcut(QStringLiteral("Move Focus Within Code"), QStringLiteral("WASD | HJKL | Arrows")),
Shortcut(
QStringLiteral("Move Focus to Closest Reference"),
QStringLiteral("Shift + WS | Shift + JK | Shift + Up/Down")),
Shortcut(QStringLiteral("Activate Focused Location"), QStringLiteral("Enter | E")),
Shortcut::defaultOrMac(
QStringLiteral("Activate Location in New Tab"),
QStringLiteral("Ctrl + Shift + Enter | Ctrl + Shift + E"),
QStringLiteral("Cmd + Shift + Enter | Cmd + Shift + E")),
Shortcut::defaultOrMac(
QStringLiteral("Next Reference"), QStringLiteral("Ctrl + G"), QStringLiteral("Cmd + G")),
Shortcut::defaultOrMac(
QStringLiteral("Previous Reference"),
QStringLiteral("Ctrl + Shift + G"),
QStringLiteral("Cmd + Shift + G")),
Shortcut::defaultOrMac(
QStringLiteral("Next Local Reference"),
QStringLiteral("Ctrl + L"),
QStringLiteral("Cmd + L")),
Shortcut::defaultOrMac(
QStringLiteral("Previous Local Reference"),
QStringLiteral("Ctrl + Shift + L"),
QStringLiteral("Cmd + Shift + L"))});
return table;
}
@@ -209,29 +250,31 @@ QTableWidget* QtKeyboardShortcuts::createGraphViewShortcutsTable()
{
QtShortcutTable* table = createTableWidget("table_graph");
table->setRowCount(7);
table->setItem(0, 0, new QTableWidgetItem(QStringLiteral("Pan left")));
table->setItem(1, 0, new QTableWidgetItem(QStringLiteral("Pan right")));
table->setItem(2, 0, new QTableWidgetItem(QStringLiteral("Pan up")));
table->setItem(3, 0, new QTableWidgetItem(QStringLiteral("Pan down")));
table->setItem(4, 0, new QTableWidgetItem(QStringLiteral("Zoom in")));
table->setItem(5, 0, new QTableWidgetItem(QStringLiteral("Zoom out")));
table->setItem(6, 0, new QTableWidgetItem(QStringLiteral("Reset Zoom")));
table->setItem(0, 1, new QTableWidgetItem(QStringLiteral("A")));
table->setItem(1, 1, new QTableWidgetItem(QStringLiteral("D")));
table->setItem(2, 1, new QTableWidgetItem(QStringLiteral("W")));
table->setItem(3, 1, new QTableWidgetItem(QStringLiteral("S")));
#if defined(Q_OS_MAC)
table->setItem(4, 1, new QTableWidgetItem("Shift + W | Cmd + Mousewheel up"));
table->setItem(5, 1, new QTableWidgetItem("Shift + S | Cmd + Mousewheel down"));
#else
table->setItem(4, 1, new QTableWidgetItem(QStringLiteral("Shift + W | Ctrl + Mousewheel up")));
table->setItem(5, 1, new QTableWidgetItem(QStringLiteral("Shift + S | Ctrl + Mousewheel down")));
#endif
table->setItem(6, 1, new QTableWidgetItem(QStringLiteral("0")));
table->updateSize();
addShortcuts(
table,
{Shortcut(QStringLiteral("Move Focus Within Nodes"), QStringLiteral("WASD | HJKL | Arrows")),
Shortcut(
QStringLiteral("Move Focus Within Edges"),
QStringLiteral("Shift + WASD | Shift + HJKL | Shift + Arrows")),
Shortcut(QStringLiteral("Activate Node/Edge"), QStringLiteral("Enter | E")),
Shortcut(QStringLiteral("Expand/Collaps Node"), QStringLiteral("Shift + Enter | Shift + E")),
Shortcut::defaultOrMac(
QStringLiteral("Activate Node in New Tab"),
QStringLiteral("Ctrl + Shift + Enter | Ctrl + Shift + E"),
QStringLiteral("Cmd + Shift + Enter | Cmd + Shift + E")),
Shortcut::defaultOrMac(
QStringLiteral("Zoom in"),
QStringLiteral("Alt + W | Ctrl + Mousewheel up"),
QStringLiteral("Alt + W | Cmd + Mousewheel up")),
Shortcut::defaultOrMac(
QStringLiteral("Zoom out"),
QStringLiteral("Alt + S | Ctrl + Mousewheel down"),
QStringLiteral("Alt + S | Cmd + Mousewheel down")),
Shortcut(QStringLiteral("Reset Zoom"), QStringLiteral("0")),
Shortcut::defaultOrMac(
QStringLiteral("Open Custom Trail Dialog"),
QStringLiteral("Ctrl + U"),
QStringLiteral("Cmd + U"))});
return table;
}