ui: Fixes related to focus navigation (#948)
Scroll graph area with Ctrl + Arrows Moved graph zoom to Ctrl + Shift + Up/Down Scroll code area with Ctrl + Arrows Fixed graph showing focus when activating the active symbol Made links in project description focus-able Fixed parent graph node not showing focus after hovering edge to child node
This commit is contained in:
@@ -913,6 +913,7 @@ std::vector<std::string> CodeController::getProjectDescription(SourceLocationFil
|
|||||||
std::vector<std::string> lines = utility::splitToVector(description, "\\n");
|
std::vector<std::string> lines = utility::splitToVector(description, "\\n");
|
||||||
size_t startLineNumber = 2;
|
size_t startLineNumber = 2;
|
||||||
|
|
||||||
|
Id locationId = 0;
|
||||||
for (size_t i = 0; i < lines.size(); i++)
|
for (size_t i = 0; i < lines.size(); i++)
|
||||||
{
|
{
|
||||||
std::string line = "\t" + utility::trim(lines[i]);
|
std::string line = "\t" + utility::trim(lines[i]);
|
||||||
@@ -943,7 +944,7 @@ std::vector<std::string> CodeController::getProjectDescription(SourceLocationFil
|
|||||||
line.replace(posA, posB - posA + 1, nameString);
|
line.replace(posA, posB - posA + 1, nameString);
|
||||||
locationFile->addSourceLocation(
|
locationFile->addSourceLocation(
|
||||||
LOCATION_TOKEN,
|
LOCATION_TOKEN,
|
||||||
0,
|
++locationId,
|
||||||
{tokenId},
|
{tokenId},
|
||||||
startLineNumber + i,
|
startLineNumber + i,
|
||||||
posA + 1,
|
posA + 1,
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include "ApplicationSettings.h"
|
#include "ApplicationSettings.h"
|
||||||
#include "ColorScheme.h"
|
#include "ColorScheme.h"
|
||||||
#include "MessageActivateLocalSymbols.h"
|
#include "MessageActivateLocalSymbols.h"
|
||||||
|
#include "MessageActivateTokenIds.h"
|
||||||
#include "MessageFocusIn.h"
|
#include "MessageFocusIn.h"
|
||||||
#include "MessageFocusOut.h"
|
#include "MessageFocusOut.h"
|
||||||
#include "MessageMoveIDECursor.h"
|
#include "MessageMoveIDECursor.h"
|
||||||
@@ -299,6 +300,11 @@ int QtCodeArea::lineNumberAreaWidth() const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int QtCodeArea::lineHeight() const
|
||||||
|
{
|
||||||
|
return static_cast<int>(blockBoundingRect(firstVisibleBlock()).height());
|
||||||
|
}
|
||||||
|
|
||||||
void QtCodeArea::updateLineNumberAreaWidthForDigits(int digits)
|
void QtCodeArea::updateLineNumberAreaWidthForDigits(int digits)
|
||||||
{
|
{
|
||||||
m_digits = digits;
|
m_digits = digits;
|
||||||
@@ -1060,7 +1066,19 @@ void QtCodeArea::activateAnnotationsOrErrors(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
activateAnnotations(annotations, fromMouse, lineNumberAreaWidth());
|
if (!m_showLineNumbers) // for links in project description
|
||||||
|
{
|
||||||
|
std::set<Id> tokenIds;
|
||||||
|
for (const Annotation* annotation: annotations)
|
||||||
|
{
|
||||||
|
tokenIds.insert(annotation->tokenIds.begin(), annotation->tokenIds.end());
|
||||||
|
}
|
||||||
|
MessageActivateTokenIds(utility::toVector(tokenIds)).dispatch();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
activateAnnotations(annotations, fromMouse, lineNumberAreaWidth());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtCodeArea::focusAnnotation(const Annotation* annotation, bool updateTargetColumn, bool fromMouse)
|
void QtCodeArea::focusAnnotation(const Annotation* annotation, bool updateTargetColumn, bool fromMouse)
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ public:
|
|||||||
void lineNumberAreaPaintEvent(QPaintEvent* event);
|
void lineNumberAreaPaintEvent(QPaintEvent* event);
|
||||||
int lineNumberDigits() const;
|
int lineNumberDigits() const;
|
||||||
int lineNumberAreaWidth() const;
|
int lineNumberAreaWidth() const;
|
||||||
|
int lineHeight() const;
|
||||||
void updateLineNumberAreaWidthForDigits(int digits);
|
void updateLineNumberAreaWidthForDigits(int digits);
|
||||||
|
|
||||||
void updateSourceLocations(std::shared_ptr<SourceLocationFile> locationFile);
|
void updateSourceLocations(std::shared_ptr<SourceLocationFile> locationFile);
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include "ColorScheme.h"
|
#include "ColorScheme.h"
|
||||||
#include "MessageActivateLocalSymbols.h"
|
#include "MessageActivateLocalSymbols.h"
|
||||||
#include "MessageActivateSourceLocations.h"
|
#include "MessageActivateSourceLocations.h"
|
||||||
#include "MessageActivateTokenIds.h"
|
|
||||||
#include "MessageTabOpenWith.h"
|
#include "MessageTabOpenWith.h"
|
||||||
#include "MessageTooltipShow.h"
|
#include "MessageTooltipShow.h"
|
||||||
#include "QtContextMenu.h"
|
#include "QtContextMenu.h"
|
||||||
@@ -562,10 +561,6 @@ void QtCodeField::activateAnnotations(
|
|||||||
{
|
{
|
||||||
MessageActivateSourceLocations(locationIds, containsUnsolved).dispatch();
|
MessageActivateSourceLocations(locationIds, containsUnsolved).dispatch();
|
||||||
}
|
}
|
||||||
else if (tokenIds.size()) // fallback for links in project description
|
|
||||||
{
|
|
||||||
MessageActivateTokenIds(utility::toVector(tokenIds)).dispatch();
|
|
||||||
}
|
|
||||||
else if (localSymbolIds.size())
|
else if (localSymbolIds.size())
|
||||||
{
|
{
|
||||||
MessageActivateLocalSymbols(utility::toVector(localSymbolIds)).dispatch();
|
MessageActivateLocalSymbols(utility::toVector(localSymbolIds)).dispatch();
|
||||||
|
|||||||
@@ -721,27 +721,73 @@ void QtCodeNavigator::keyPressEvent(QKeyEvent* event)
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
auto moveView = [=](CodeFocusHandler::Direction direction) {
|
||||||
|
if (!alt && !shift && ctrl)
|
||||||
|
{
|
||||||
|
QAbstractScrollArea* scrollArea = currentFocus.area;
|
||||||
|
int step = currentFocus.area ? currentFocus.area->lineHeight() * 3 : 50;
|
||||||
|
if (direction == CodeFocusHandler::Direction::DOWN || direction == CodeFocusHandler::Direction::UP)
|
||||||
|
{
|
||||||
|
if (m_mode == MODE_LIST)
|
||||||
|
{
|
||||||
|
scrollArea = m_list->getScrollArea();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
step = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scrollArea)
|
||||||
|
{
|
||||||
|
QScrollBar* horizontalScrollBar = scrollArea->horizontalScrollBar();
|
||||||
|
QScrollBar* verticalScrollBar = scrollArea->verticalScrollBar();
|
||||||
|
|
||||||
|
if (direction == CodeFocusHandler::Direction::DOWN)
|
||||||
|
{
|
||||||
|
verticalScrollBar->setValue(verticalScrollBar->value() + step);
|
||||||
|
}
|
||||||
|
else if (direction == CodeFocusHandler::Direction::UP)
|
||||||
|
{
|
||||||
|
verticalScrollBar->setValue(verticalScrollBar->value() - step);
|
||||||
|
}
|
||||||
|
else if (direction == CodeFocusHandler::Direction::RIGHT)
|
||||||
|
{
|
||||||
|
horizontalScrollBar->setValue(horizontalScrollBar->value() + step);
|
||||||
|
}
|
||||||
|
else if (direction == CodeFocusHandler::Direction::LEFT)
|
||||||
|
{
|
||||||
|
horizontalScrollBar->setValue(horizontalScrollBar->value() - step);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
switch (event->key())
|
switch (event->key())
|
||||||
{
|
{
|
||||||
case Qt::Key_Up:
|
case Qt::Key_Up:
|
||||||
|
moveView(CodeFocusHandler::Direction::UP);
|
||||||
case Qt::Key_K:
|
case Qt::Key_K:
|
||||||
case Qt::Key_W:
|
case Qt::Key_W:
|
||||||
moveFocus(CodeFocusHandler::Direction::UP);
|
moveFocus(CodeFocusHandler::Direction::UP);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Qt::Key_Down:
|
case Qt::Key_Down:
|
||||||
|
moveView(CodeFocusHandler::Direction::DOWN);
|
||||||
case Qt::Key_J:
|
case Qt::Key_J:
|
||||||
case Qt::Key_S:
|
case Qt::Key_S:
|
||||||
moveFocus(CodeFocusHandler::Direction::DOWN);
|
moveFocus(CodeFocusHandler::Direction::DOWN);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Qt::Key_Left:
|
case Qt::Key_Left:
|
||||||
|
moveView(CodeFocusHandler::Direction::LEFT);
|
||||||
case Qt::Key_H:
|
case Qt::Key_H:
|
||||||
case Qt::Key_A:
|
case Qt::Key_A:
|
||||||
moveFocus(CodeFocusHandler::Direction::LEFT);
|
moveFocus(CodeFocusHandler::Direction::LEFT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Qt::Key_Right:
|
case Qt::Key_Right:
|
||||||
|
moveView(CodeFocusHandler::Direction::RIGHT);
|
||||||
case Qt::Key_L:
|
case Qt::Key_L:
|
||||||
case Qt::Key_D:
|
case Qt::Key_D:
|
||||||
moveFocus(CodeFocusHandler::Direction::RIGHT);
|
moveFocus(CodeFocusHandler::Direction::RIGHT);
|
||||||
|
|||||||
@@ -316,32 +316,39 @@ void QtGraphicsView::keyPressEvent(QKeyEvent* event)
|
|||||||
switch (event->key())
|
switch (event->key())
|
||||||
{
|
{
|
||||||
case Qt::Key_Up:
|
case Qt::Key_Up:
|
||||||
case Qt::Key_K:
|
if (ctrl && !alt)
|
||||||
case Qt::Key_W:
|
|
||||||
if (alt)
|
|
||||||
{
|
{
|
||||||
m_up = true;
|
m_up = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (!ctrl)
|
case Qt::Key_K:
|
||||||
|
case Qt::Key_W:
|
||||||
|
if (!ctrl && !alt)
|
||||||
{
|
{
|
||||||
m_focusHandler->focusNext(GraphFocusHandler::Direction::UP, shift);
|
m_focusHandler->focusNext(GraphFocusHandler::Direction::UP, shift);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Qt::Key_Down:
|
case Qt::Key_Down:
|
||||||
case Qt::Key_J:
|
if (ctrl && !alt)
|
||||||
case Qt::Key_S:
|
|
||||||
if (alt)
|
|
||||||
{
|
{
|
||||||
m_down = true;
|
m_down = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (!ctrl)
|
case Qt::Key_J:
|
||||||
|
case Qt::Key_S:
|
||||||
|
if (!alt && !ctrl)
|
||||||
{
|
{
|
||||||
m_focusHandler->focusNext(GraphFocusHandler::Direction::DOWN, shift);
|
m_focusHandler->focusNext(GraphFocusHandler::Direction::DOWN, shift);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Qt::Key_Left:
|
case Qt::Key_Left:
|
||||||
|
if (ctrl && !shift && !alt)
|
||||||
|
{
|
||||||
|
m_left = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case Qt::Key_H:
|
case Qt::Key_H:
|
||||||
case Qt::Key_A:
|
case Qt::Key_A:
|
||||||
if (!alt && !ctrl)
|
if (!alt && !ctrl)
|
||||||
@@ -351,6 +358,11 @@ void QtGraphicsView::keyPressEvent(QKeyEvent* event)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Qt::Key_Right:
|
case Qt::Key_Right:
|
||||||
|
if (ctrl && !shift && !alt)
|
||||||
|
{
|
||||||
|
m_right = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case Qt::Key_L:
|
case Qt::Key_L:
|
||||||
case Qt::Key_D:
|
case Qt::Key_D:
|
||||||
if (!alt && !ctrl)
|
if (!alt && !ctrl)
|
||||||
@@ -394,8 +406,11 @@ void QtGraphicsView::keyPressEvent(QKeyEvent* event)
|
|||||||
setZoomFactor(1.0f);
|
setZoomFactor(1.0f);
|
||||||
updateTransform();
|
updateTransform();
|
||||||
break;
|
break;
|
||||||
case Qt::Key_Alt:
|
case Qt::Key_Shift:
|
||||||
m_alt = true;
|
m_shift = true;
|
||||||
|
break;
|
||||||
|
case Qt::Key_Control:
|
||||||
|
m_ctrl = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
QGraphicsView::keyPressEvent(event);
|
QGraphicsView::keyPressEvent(event);
|
||||||
@@ -414,14 +429,25 @@ void QtGraphicsView::keyReleaseEvent(QKeyEvent* event)
|
|||||||
{
|
{
|
||||||
switch (event->key())
|
switch (event->key())
|
||||||
{
|
{
|
||||||
|
case Qt::Key_Up:
|
||||||
case Qt::Key_W:
|
case Qt::Key_W:
|
||||||
m_up = false;
|
m_up = false;
|
||||||
break;
|
break;
|
||||||
|
case Qt::Key_Down:
|
||||||
case Qt::Key_S:
|
case Qt::Key_S:
|
||||||
m_down = false;
|
m_down = false;
|
||||||
break;
|
break;
|
||||||
case Qt::Key_Alt:
|
case Qt::Key_Left:
|
||||||
m_alt = false;
|
m_left = false;
|
||||||
|
break;
|
||||||
|
case Qt::Key_Right:
|
||||||
|
m_right = false;
|
||||||
|
break;
|
||||||
|
case Qt::Key_Shift:
|
||||||
|
m_shift = false;
|
||||||
|
break;
|
||||||
|
case Qt::Key_Control:
|
||||||
|
m_ctrl = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
@@ -579,9 +605,13 @@ void QtGraphicsView::focusOutEvent(QFocusEvent* event)
|
|||||||
|
|
||||||
void QtGraphicsView::updateTimer()
|
void QtGraphicsView::updateTimer()
|
||||||
{
|
{
|
||||||
|
const int ds = 30;
|
||||||
const float dz = 50.0f;
|
const float dz = 50.0f;
|
||||||
|
|
||||||
if (m_alt)
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
|
||||||
|
if (m_shift && m_ctrl)
|
||||||
{
|
{
|
||||||
if (m_up)
|
if (m_up)
|
||||||
{
|
{
|
||||||
@@ -592,6 +622,36 @@ void QtGraphicsView::updateTimer()
|
|||||||
updateZoom(-dz);
|
updateZoom(-dz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (m_ctrl)
|
||||||
|
{
|
||||||
|
if (m_up)
|
||||||
|
{
|
||||||
|
y -= ds;
|
||||||
|
}
|
||||||
|
else if (m_down)
|
||||||
|
{
|
||||||
|
y += ds;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_left)
|
||||||
|
{
|
||||||
|
x -= ds;
|
||||||
|
}
|
||||||
|
else if (m_right)
|
||||||
|
{
|
||||||
|
x += ds;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x != 0)
|
||||||
|
{
|
||||||
|
horizontalScrollBar()->setValue(horizontalScrollBar()->value() + x);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y != 0)
|
||||||
|
{
|
||||||
|
verticalScrollBar()->setValue(verticalScrollBar()->value() + y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtGraphicsView::stopTimer()
|
void QtGraphicsView::stopTimer()
|
||||||
@@ -748,7 +808,7 @@ void QtGraphicsView::legendClicked()
|
|||||||
|
|
||||||
bool QtGraphicsView::moves() const
|
bool QtGraphicsView::moves() const
|
||||||
{
|
{
|
||||||
return m_up || m_down;
|
return m_up || m_down || m_left || m_right;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtGraphicsView::setZoomFactor(float zoomFactor)
|
void QtGraphicsView::setZoomFactor(float zoomFactor)
|
||||||
|
|||||||
@@ -97,7 +97,11 @@ private:
|
|||||||
|
|
||||||
bool m_up = false;
|
bool m_up = false;
|
||||||
bool m_down = false;
|
bool m_down = false;
|
||||||
bool m_alt = false;
|
bool m_left = false;
|
||||||
|
bool m_right = false;
|
||||||
|
|
||||||
|
bool m_shift = false;
|
||||||
|
bool m_ctrl = false;
|
||||||
|
|
||||||
std::wstring m_clipboardNodeName;
|
std::wstring m_clipboardNodeName;
|
||||||
Id m_openInTabNodeId;
|
Id m_openInTabNodeId;
|
||||||
|
|||||||
@@ -277,6 +277,8 @@ void QtGraphNode::setIsFocused(bool focused)
|
|||||||
{
|
{
|
||||||
coFocusOut();
|
coFocusOut();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateStyle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -414,10 +414,14 @@ void QtGraphView::rebuildGraph(
|
|||||||
{
|
{
|
||||||
m_focusHandler.focusTokenId(m_nodes, m_edges, params.tokenIdToFocus);
|
m_focusHandler.focusTokenId(m_nodes, m_edges, params.tokenIdToFocus);
|
||||||
}
|
}
|
||||||
else
|
else if (hasNavigationFocus())
|
||||||
{
|
{
|
||||||
m_focusHandler.refocusNode(m_nodes, oldActiveTokenId, newActiveTokenId);
|
m_focusHandler.refocusNode(m_nodes, oldActiveTokenId, newActiveTokenId);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_focusHandler.clear();
|
||||||
|
}
|
||||||
|
|
||||||
m_centerActiveNode = params.centerActiveNode;
|
m_centerActiveNode = params.centerActiveNode;
|
||||||
m_scrollToTop = params.scrollToTop;
|
m_scrollToTop = params.scrollToTop;
|
||||||
|
|||||||
@@ -241,7 +241,11 @@ QTableWidget* QtKeyboardShortcuts::createCodeViewShortcutsTable()
|
|||||||
Shortcut::defaultOrMac(
|
Shortcut::defaultOrMac(
|
||||||
QStringLiteral("Previous Local Reference"),
|
QStringLiteral("Previous Local Reference"),
|
||||||
QStringLiteral("Ctrl + Shift + L"),
|
QStringLiteral("Ctrl + Shift + L"),
|
||||||
QStringLiteral("Cmd + Shift + L"))});
|
QStringLiteral("Cmd + Shift + L")),
|
||||||
|
Shortcut::defaultOrMac(
|
||||||
|
QStringLiteral("Scroll Code Area"),
|
||||||
|
QStringLiteral("Ctrl + Arrows"),
|
||||||
|
QStringLiteral("Cmd + Arrows"))});
|
||||||
|
|
||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
@@ -262,14 +266,18 @@ QTableWidget* QtKeyboardShortcuts::createGraphViewShortcutsTable()
|
|||||||
QStringLiteral("Activate Node in New Tab"),
|
QStringLiteral("Activate Node in New Tab"),
|
||||||
QStringLiteral("Ctrl + Shift + Enter | Ctrl + Shift + E"),
|
QStringLiteral("Ctrl + Shift + Enter | Ctrl + Shift + E"),
|
||||||
QStringLiteral("Cmd + Shift + Enter | Cmd + Shift + E")),
|
QStringLiteral("Cmd + Shift + Enter | Cmd + Shift + E")),
|
||||||
|
Shortcut::defaultOrMac(
|
||||||
|
QStringLiteral("Scroll Graph Area"),
|
||||||
|
QStringLiteral("Ctrl + Arrows"),
|
||||||
|
QStringLiteral("Cmd + Arrows")),
|
||||||
Shortcut::defaultOrMac(
|
Shortcut::defaultOrMac(
|
||||||
QStringLiteral("Zoom in"),
|
QStringLiteral("Zoom in"),
|
||||||
QStringLiteral("Alt + W | Ctrl + Mousewheel up"),
|
QStringLiteral("Ctrl + Shift + Up | Ctrl + Mousewheel up"),
|
||||||
QStringLiteral("Alt + W | Cmd + Mousewheel up")),
|
QStringLiteral("Cmd + Shift + Up | Cmd + Mousewheel up")),
|
||||||
Shortcut::defaultOrMac(
|
Shortcut::defaultOrMac(
|
||||||
QStringLiteral("Zoom out"),
|
QStringLiteral("Zoom out"),
|
||||||
QStringLiteral("Alt + S | Ctrl + Mousewheel down"),
|
QStringLiteral("Ctrl + Shift + Down | Ctrl + Mousewheel down"),
|
||||||
QStringLiteral("Alt + S | Cmd + Mousewheel down")),
|
QStringLiteral("Cmd + Shift + Down | Cmd + Mousewheel down")),
|
||||||
Shortcut(QStringLiteral("Reset Zoom"), QStringLiteral("0")),
|
Shortcut(QStringLiteral("Reset Zoom"), QStringLiteral("0")),
|
||||||
Shortcut::defaultOrMac(
|
Shortcut::defaultOrMac(
|
||||||
QStringLiteral("Open Custom Trail Dialog"),
|
QStringLiteral("Open Custom Trail Dialog"),
|
||||||
|
|||||||
@@ -931,7 +931,7 @@ void QtMainWindow::setupEditMenu()
|
|||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
|
|
||||||
menu->addAction(
|
menu->addAction(
|
||||||
tr("&To overview"), this, &QtMainWindow::overview, QKeySequence::MoveToStartOfDocument);
|
tr("&To overview"), this, &QtMainWindow::overview, QKeySequence(Qt::CTRL + Qt::Key_Home));
|
||||||
|
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user