diff --git a/src/dialogs/katedialogs.cpp b/src/dialogs/katedialogs.cpp --- a/src/dialogs/katedialogs.cpp +++ b/src/dialogs/katedialogs.cpp @@ -392,6 +392,7 @@ connect(ui->sbAutoCenterCursor, SIGNAL(valueChanged(int)), this, SLOT(slotChanged())); connect(ui->chkScrollPastEnd, SIGNAL(toggled(bool)), this, SLOT(slotChanged())); connect(ui->chkBackspaceRemoveComposed, SIGNAL(toggled(bool)), this, SLOT(slotChanged())); + connect(ui->chkClickLineNumberSelectsLine, SIGNAL(toggled(bool)), this, SLOT(slotChanged())); layout->addWidget(newWidget); setLayout(layout); @@ -423,6 +424,7 @@ KateViewConfig::global()->setScrollPastEnd(ui->chkScrollPastEnd->isChecked()); KateViewConfig::global()->setBackspaceRemoveComposed(ui->chkBackspaceRemoveComposed->isChecked()); + KateViewConfig::global()->setClickLineNumberSelectsLine(ui->chkClickLineNumberSelectsLine->isChecked()); KateDocumentConfig::global()->configEnd(); KateViewConfig::global()->configEnd(); @@ -437,6 +439,7 @@ ui->sbAutoCenterCursor->setValue(KateViewConfig::global()->autoCenterLines()); ui->chkScrollPastEnd->setChecked(KateViewConfig::global()->scrollPastEnd()); ui->chkBackspaceRemoveComposed->setChecked(KateViewConfig::global()->backspaceRemoveComposed()); + ui->chkClickLineNumberSelectsLine->setChecked(KateViewConfig::global()->clickLineNumberSelectsLine()); } QString KateNavigationConfigTab::name() const diff --git a/src/dialogs/navigationconfigwidget.ui b/src/dialogs/navigationconfigwidget.ui --- a/src/dialogs/navigationconfigwidget.ui +++ b/src/dialogs/navigationconfigwidget.ui @@ -40,7 +40,7 @@ - &Autocenter cursor: + A&utocenter cursor: sbAutoCenterCursor @@ -89,7 +89,7 @@ - Text selection mode: + &Text selection mode: cbTextSelectionMode @@ -142,6 +142,16 @@ + + + + When selected, single clicking a line number will select the entire line of text. + + + Single click on line number selects line + + + @@ -160,6 +170,15 @@ + + chkSmartHome + chkPagingMovesCursor + sbAutoCenterCursor + cbTextSelectionMode + chkScrollPastEnd + chkBackspaceRemoveComposed + chkClickLineNumberSelectsLine + diff --git a/src/utils/kateconfig.h b/src/utils/kateconfig.h --- a/src/utils/kateconfig.h +++ b/src/utils/kateconfig.h @@ -578,6 +578,9 @@ bool backspaceRemoveComposed() const; void setBackspaceRemoveComposed(bool on); + bool clickLineNumberSelectsLine() const; + void setClickLineNumberSelectsLine(bool on); + private: bool m_dynWordWrap; int m_dynWordWrapIndicators; @@ -613,6 +616,7 @@ bool m_showWordCount; bool m_autoBrackets; bool m_backspaceRemoveComposed; + bool m_clickLineNumberSelectsLine; bool m_dynWordWrapSet : 1; bool m_dynWordWrapIndicatorsSet : 1; @@ -647,6 +651,7 @@ bool m_foldFirstLineSet : 1; bool m_autoBracketsSet : 1; bool m_backspaceRemoveComposedSet : 1; + bool m_clickLineNumberSelectsLineSet : 1; private: static KateViewConfig *s_global; diff --git a/src/utils/kateconfig.cpp b/src/utils/kateconfig.cpp --- a/src/utils/kateconfig.cpp +++ b/src/utils/kateconfig.cpp @@ -1267,6 +1267,7 @@ m_foldFirstLineSet (false), m_autoBracketsSet(false), m_backspaceRemoveComposedSet(false), + m_clickLineNumberSelectsLineSet(false), m_view(nullptr) { s_global = this; @@ -1314,6 +1315,7 @@ m_foldFirstLineSet(false), m_autoBracketsSet(false), m_backspaceRemoveComposedSet(false), + m_clickLineNumberSelectsLineSet(false), m_view(view) { } @@ -1359,6 +1361,7 @@ const char KEY_SHOW_WORD_COUNT[] = "Show Word Count"; const char KEY_AUTO_BRACKETS[] = "Auto Brackets"; const char KEY_BACKSPACE_REMOVE_COMPOSED[] = "Backspace Remove Composed Characters"; +const char KEY_CLICK_LINE_NUMBER_SELECTS_LINE[] = "Click Line Number Selects Line"; } void KateViewConfig::readConfig(const KConfigGroup &config) @@ -1422,6 +1425,7 @@ setAutoBrackets(config.readEntry(KEY_AUTO_BRACKETS, false)); setBackspaceRemoveComposed(config.readEntry(KEY_BACKSPACE_REMOVE_COMPOSED, false)); + setClickLineNumberSelectsLine(config.readEntry(KEY_CLICK_LINE_NUMBER_SELECTS_LINE, false)); configEnd(); } @@ -1486,6 +1490,7 @@ config.writeEntry(KEY_AUTO_BRACKETS, autoBrackets()); config.writeEntry(KEY_BACKSPACE_REMOVE_COMPOSED, backspaceRemoveComposed()); + config.writeEntry(KEY_CLICK_LINE_NUMBER_SELECTS_LINE, clickLineNumberSelectsLine()); } void KateViewConfig::updateConfig() @@ -2267,6 +2272,29 @@ configEnd(); } +bool KateViewConfig::clickLineNumberSelectsLine() const +{ + if (m_clickLineNumberSelectsLineSet || isGlobal()) { + return m_clickLineNumberSelectsLine; + } + + return s_global->clickLineNumberSelectsLine(); +} + +void KateViewConfig::setClickLineNumberSelectsLine(bool on) +{ + if (m_clickLineNumberSelectsLineSet && m_clickLineNumberSelectsLine == on) { + return; + } + + configStart(); + + m_clickLineNumberSelectsLineSet = true; + m_clickLineNumberSelectsLine = on; + + configEnd(); +} + //END //BEGIN KateRendererConfig 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,14 @@ const KateTextLayout &t = m_viewInternal->yToKateTextLayout(e->y()); if (t.isValid()) { m_lastClickedLine = t.line(); - if (positionToArea(e->pos()) != IconBorder && positionToArea(e->pos()) != AnnotationBorder) { + auto area = positionToArea(e->pos()); + if (area != IconBorder && area != AnnotationBorder) { + auto pos = QPoint(0, e->y()); + if (area == LineNumbers && e->button() == Qt::LeftButton && !(e->modifiers() & Qt::ShiftModifier)) { + 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(); @@ -2175,13 +2180,14 @@ void KateIconBorder::mouseMoveEvent(QMouseEvent *e) { const KateTextLayout &t = m_viewInternal->yToKateTextLayout(e->y()); + auto area = positionToArea(e->pos()); if (t.isValid()) { - if (positionToArea(e->pos()) == FoldingMarkers) { + if (area == FoldingMarkers) { showDelayedBlock(t.line()); } else { hideBlock(); } - if (positionToArea(e->pos()) == AnnotationBorder) { + if (area == AnnotationBorder) { KTextEditor::AnnotationModel *model = m_view->annotationModel() ? m_view->annotationModel() : m_doc->annotationModel(); if (model) { @@ -2191,23 +2197,24 @@ QTimer::singleShot(0, this, SLOT(update())); } } else { - if (positionToArea(e->pos()) == IconBorder) { + if (area == IconBorder) { m_doc->requestMarkTooltip(t.line(), e->globalPos()); } m_hoveredAnnotationGroupIdentifier.clear(); hideAnnotationTooltip(); QTimer::singleShot(0, this, SLOT(update())); } - if (positionToArea(e->pos()) != IconBorder) { - QPoint p = m_viewInternal->mapFromGlobal(e->globalPos()); - QMouseEvent forward(QEvent::MouseMove, p, e->button(), e->buttons(), e->modifiers()); - m_viewInternal->mouseMoveEvent(&forward); - } } else { // remove hovering if it's still there removeAnnotationHovering(); } + // always forward event so dragging on border to select lines will scroll down when at top + if (area != IconBorder) { + QPoint p = m_viewInternal->mapFromGlobal(e->globalPos()); + QMouseEvent forward(QEvent::MouseMove, p, e->button(), e->buttons(), e->modifiers()); + m_viewInternal->mouseMoveEvent(&forward); + } QWidget::mouseMoveEvent(e); } 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,16 @@ m_possibleTripleClick = false; } +void KateViewInternal::beginSelectLine(const QPoint &pos) +{ + if (m_view->config()->clickLineNumberSelectsLine()) { + placeCursor(pos); + m_possibleTripleClick = true; + m_scrollX = 0; + m_scrollY = 0; + } +} + void KateViewInternal::mouseReleaseEvent(QMouseEvent *e) { switch (e->button()) {