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()) {