ui: fixed panning in code

* fixed bug where panning stopped when hovering the line number area in the code view.
* when relasing the mouse button on a clickable code location after panning the location is not activated.
This commit is contained in:
malte_langkabel
2016-04-25 10:29:55 +02:00
parent 6bca5d2964
commit 55660563c8
2 changed files with 31 additions and 19 deletions
+28 -18
View File
@@ -91,7 +91,7 @@ QtCodeArea::QtCodeArea(
, m_code(code)
, m_locationFile(locationFile)
, m_digits(0)
, m_panningValue(-1)
, m_isPanning(false)
, m_setIDECursorPositionAction(nullptr)
, m_eventPosition(0, 0)
, m_isActiveFile(false)
@@ -412,44 +412,54 @@ void QtCodeArea::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
m_panningValue = event->pos().x();
m_isPanning = true;
m_oldMousePosition = event->pos();
m_panningDistance = 0;
}
}
void QtCodeArea::mouseReleaseEvent(QMouseEvent* event)
{
const int panningThreshold = 5;
if (event->button() == Qt::LeftButton)
{
m_panningValue = -1;
m_isPanning = false;
if (Qt::KeyboardModifier::ControlModifier && QApplication::keyboardModifiers())
if (m_panningDistance < panningThreshold) // dont do anything if mouse is release to end some real panning action.
{
m_eventPosition = event->pos();
setIDECursorPosition();
}
else if (!m_fileWidget->hasErrors())
{
QTextCursor cursor = this->cursorForPosition(event->pos());
std::vector<const Annotation*> annotations = getNonScopeAnnotationsForPosition(cursor.position());
if (Qt::KeyboardModifier::ControlModifier && QApplication::keyboardModifiers())
{
m_eventPosition = event->pos();
setIDECursorPosition();
}
else if (!m_fileWidget->hasErrors())
{
QTextCursor cursor = this->cursorForPosition(event->pos());
std::vector<const Annotation*> annotations = getNonScopeAnnotationsForPosition(cursor.position());
activateTokenLocations(annotations);
activateLocalSymbols(annotations);
activateTokenLocations(annotations);
activateLocalSymbols(annotations);
}
}
}
}
void QtCodeArea::mouseMoveEvent(QMouseEvent* event)
{
if (m_panningValue != -1)
if (m_isPanning)
{
int panningCurrentPosition = event->pos().x();
int deltaPos = panningCurrentPosition - m_panningValue;
m_panningValue = panningCurrentPosition;
const QPoint currentMousePosition = event->pos();
const int deltaX = currentMousePosition.x() - m_oldMousePosition.x();
const int deltaY = currentMousePosition.y() - m_oldMousePosition.y();
m_oldMousePosition = currentMousePosition;
QScrollBar* scrollbar = horizontalScrollBar();
int visibleContentWidth = width() - lineNumberAreaWidth();
float deltaPosRatio = float(deltaPos) / (visibleContentWidth);
float deltaPosRatio = float(deltaX) / (visibleContentWidth);
scrollbar->setValue(scrollbar->value() - utility::roundToInt(deltaPosRatio * scrollbar->pageStep()));
m_panningDistance += abs(deltaX + deltaY);
std::cout << m_panningDistance << std::endl;
}
+3 -1
View File
@@ -179,7 +179,9 @@ private:
std::vector<const Annotation*> m_hoveredAnnotations;
int m_digits;
int m_panningValue; // just for horizontal panning
bool m_isPanning;
QPoint m_oldMousePosition;
int m_panningDistance;
QAction* m_setIDECursorPositionAction;
QPoint m_eventPosition; // is needed for IDE cursor control via context menu