diff --git a/src/view/kateviewhelpers.cpp b/src/view/kateviewhelpers.cpp --- a/src/view/kateviewhelpers.cpp +++ b/src/view/kateviewhelpers.cpp @@ -2015,9 +2015,16 @@ const KateTextLayout &t = m_viewInternal->yToKateTextLayout(e->y()); if (t.isValid()) { m_lastClickedLine = t.line(); - if (positionToArea(e->pos()) != IconBorder && positionToArea(e->pos()) != AnnotationBorder) { + const auto area = positionToArea(e->pos()); + // IconBorder and AnnotationBorder have their own behavior; don't forward to view + if (area != IconBorder && area != AnnotationBorder) { + const auto pos = QPoint(0, e->y()); + if (area == LineNumbers && e->button() == Qt::LeftButton && !(e->modifiers() & Qt::ShiftModifier)) { + // setup view so the following mousePressEvent will select the line + m_viewInternal->beginSelectLine(pos); + } QMouseEvent forward(QEvent::MouseButtonPress, - QPoint(0, e->y()), e->button(), e->buttons(), e->modifiers()); + pos, e->button(), e->buttons(), e->modifiers()); m_viewInternal->mousePressEvent(&forward); } return e->accept(); diff --git a/src/view/kateviewinternal.h b/src/view/kateviewinternal.h --- a/src/view/kateviewinternal.h +++ b/src/view/kateviewinternal.h @@ -269,6 +269,7 @@ void moveCursorToSelectionEdge(); void updateCursor(const KTextEditor::Cursor &newCursor, bool force = false, bool center = false, bool calledExternally = false); void updateBracketMarks(); + void beginSelectLine(const QPoint &pos); void placeCursor(const QPoint &p, bool keepSelection = false, bool updateSelection = true); bool isTargetSelected(const QPoint &p); diff --git a/src/view/kateviewinternal.cpp b/src/view/kateviewinternal.cpp --- a/src/view/kateviewinternal.cpp +++ b/src/view/kateviewinternal.cpp @@ -2781,6 +2781,12 @@ m_possibleTripleClick = false; } +void KateViewInternal::beginSelectLine(const QPoint &pos) +{ + placeCursor(pos); + m_possibleTripleClick = true; // set so subsequent mousePressEvent will select line +} + void KateViewInternal::mouseReleaseEvent(QMouseEvent *e) { switch (e->button()) {